“服务”-命令和环境变量


8

我正在尝试启动需要环境的服务。变量设置为特定路径。我在“ /etc/profile.d/”中设置此变量。但是,当我使用service命令启动此服务时,它不起作用。

人工服务:

service runs a System V init script in as predictable environment as possible,
removing most environment variables and with current working directory set to /.

因此,似乎service正在删除我的变量。我应该如何设置变量以防止它们被删除。还是那是我不应该做的事情。

可以使用init脚本手动启动该服务,甚至可以将路径硬编码到脚本中,但是我想知道如何在service命令中使用它。

Answers:


4

从Fedora 16开始,service仅接受LANGTERM环境变量,其他所有内容均被丢弃。因此,即使您当前的{CentOS,RHEL}以某种方式接受变量,也要为将来不再起作用的情况做好准备。

因此,您可以选择硬编码初始化脚本和/或在守护程序设置文件中设置变量。


缺点是每次我更新应用程序时都必须更改文件,但我想我只需要...(...不经常更新)
Esa Varemo 2012年

好吧,“经常更新”是当今的一种规范。忍受它。
Janne Pikkarainen 2012年

6

建议将配置设置放在一个配置中/etc/sysconfig/<servicename>,然后由初始化脚本读取。

问候

布拉姆


作为/etc/sysconfig/<servicename>文件中的另一个技巧,您可以使用bash source加载源文件/etc/profile.d以模仿shell登录环境。
亚当·根特

2

来自man 5 init

   工作环境
       每个作业都通过启动它的事件或命令与环境一起运行。此外,您可以在
       可以稍后覆盖的作业,并指定将哪些环境变量导出到为作业生成的事件中。

       特殊的UPSTART_EVENTS环境变量包含启动作业的事件列表,如果
       作业是手动启动的。

       此外,停止前脚本和停止后脚本与停止作业的事件或命令的环境一起运行。
       UPSTART_STOP_EVENTS环境变量包含停止该作业的事件列表,如果该作业将不存在
       手动停止。

       所有作业还包含UPSTART_JOB和UPSTART_INSTANCE环境变量,其中包含作业和实例的名称。
       initctl(8)实用程序通常使用这些命令来默认执行从其调用命令的作业。

       环保键[= VALUE]
              定义默认环境变量,启动工作的事件或命令可以覆盖其默认值。
              如果指定了“ KEY = VALUE”,则变量KEY被赋予值VALUE。如果仅给出“ KEY”,则取值
              来自init(8)守护程序自己的环境。

       出口钥匙
              为此,将环境变量的值导出到starting(7),started(7),stopping(7)和stopped(7)事件中
              作业以及所有结果事件(不仅是与当前作业有关的事件)。

另外,您可以grep env /etc/init/*查看如何使用

这是我的输出:

/etc/init/container-detect.conf:env容器
/etc/init/container-detect.conf:env LIBVIRT_LXC_UUID
/etc/init/container-detect.conf:#用于检查init环境中的“容器”。
/etc/init/container-detect.conf:[-d / proc / vz] && [!-d / proc / bc] && container = openvz
/etc/init/mount-debugfs.conf:env MOUNTPOINT = / sys / kernel / debug
/etc/init/mount-dev.conf:env MOUNTPOINT = / dev
/etc/init/mount-proc.conf:env MOUNTPOINT = / proc
/etc/init/mount-tmp.conf:env MOUNTPOINT = / tmp
/etc/init/munin-node.conf:env DAEMON = / usr / sbin / munin-node
/etc/init/mysql.conf:env HOME = / etc / mysql
/etc/init/nginx.conf:env DAEMON = / usr / local / nginx / sbin / nginx
/etc/init/nginx.conf:env PID = / usr / local / nginx / logs / nginx.pid
/etc/init/procps.conf:env UPSTART_EVENTS =
/etc/init/rc.conf:env INIT_VERBOSE
/etc/init/rc-sysinit.conf:env DEFAULT_RUNLEVEL = 2
/etc/init/rc-sysinit.conf:env RUNLEVEL =
/etc/init/rc-sysinit.conf:env PREVLEVEL =
/etc/init/rc-sysinit.conf:env INIT_VERBOSE
/etc/init/wait-for-state.conf:env TIMEOUT = 30
/etc/init/wait-for-state.conf:env MANUAL_OVERRIDE =“ N”
/etc/init/wait-for-state.conf:env WAIT_FOREVER =“ N”
/etc/init/wait-for-state.conf:env WAIT_STATE =“ started”
/etc/init/wait-for-state.conf:env TARGET_GOAL =“开始”

有关详尽的示例,请参见其中的一些脚本。这里nginx.conf:

#nginx

说明“ nginx http守护程序”
作者“ Philipp Klose”

开始于(文件系统和网络设备IFACE = lo)
在运行级别上停止[!2345]

env DAEMON = / usr / local / nginx / sbin / nginx
信封PID = / usr / local / nginx / logs / nginx.pid

期待叉
重生
重生限制10 5
#oom永不

启动前脚本
 $ DAEMON -t
 如果[$?-ne 0]
 然后退出$?
 科幻
结束脚本

exec $ DAEMON
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.