如何在Linux服务中设置环境变量以供Asterisk使用,即使它没有真实用户?

16

我创建了一个在Linux上作为守护进程运行的服务(并从/etc/init.d/X启动)。 我需要设置一些环境变量,以便应用程序可以访问这些变量。

这是场景。 应用程序是一堆Perl AGI脚本,依赖于(并且需要作为)asterisk用户运行,但是asterisk没有shell。 理想情况下,我只需在/home/asterisk/.bashrc中设置即可,但是对于asterisk来说这个文件不存在。

如何在asterisk用户的运行环境中为我的应用程序设置环境变量,以便我的应用程序可以使用它们?

2个回答

29

要么在启动脚本(/etc/init.d/yourdaemon)中设置它们,要么在该文件中添加一行类似于以下内容的代码:

. /etc/yourdaemon.env

创建一个文件,并使用 export VAR=value 语法将环境变量放入该文件中。在类似于 Red Hat 的系统上,我认为这样的文件的正确位置是 /etc/sysconfig。Debian/Ubuntu 系统似乎有用于此目的的 /etc/default


1
start-stop-daemon --start --chuid=$USER --exec $DAEMON。这将以$USER身份执行应用程序。 - domino
我检查了Debian版本的start-stop-daemon源代码,只有一个地方涉及环境变量,用于重置HOME。你能发布一下init.d脚本吗? - Fred Foo
6
它起作用了。我是那个没有使用“export”的人。谢谢。对于未来的用户,只有一个小提示 - 如果在运行“/etc/init.d/myscript”时需要源文件,则最好将其添加到“/etc/default/myscript”。 - domino
每个进程都会将其环境传递给其子进程。start-stop-daemon程序从init.d脚本获取其环境;然后它在内部切换用户,短暂地以asterisk用户身份运行并保留其环境;然后启动您的守护程序。您必须显式使用env命令来清除环境。 - Fred Foo
@domino 你的评论对我有用,而不是答案。我不知道为什么。 - AliBZ
显示剩余2条评论

4
如果你使用的发行版现在正在使用 systemd,请尝试使用 systemctl edit --full asterisk.service 命令,并考虑适用 EnvironmentFileEnvironment 参数。

这些文件通常位于以下位置:/etc/systemd/system/myservice.service,例如:cron.service


你的回答帮助我找到了这个答案(https://unix.stackexchange.com/a/455283/248589),解决了我的问题。 - sequence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接