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

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

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

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正在删除我的变量。我应该如何设置变量以防止它们被删除。或者这是我应该不做。

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

答案1

从 Fedora 16 开始,service只接受LANG环境TERM变量,其他一切都会被丢弃。因此,即使您当前的 {CentOS、RHEL} 以某种方式接受了变量,也要为将来不再起作用做好准备。

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

答案2

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

问候

布拉姆

答案3

man 5 init

   工作环境
       每个作业都使用启动它的事件或命令的环境运行。此外,您还可以在
       job 稍后可能会被覆盖,并指定哪些环境变量被导出到为该作业生成的事件中。

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

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

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

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

       导出密钥
              将环境变量的值导出到此的starting(7)、started(7)、stopping(7)和stopped(7)事件中
              工作以及由此产生的所有事件(不仅仅是与当前工作相关的事件)。

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

这是我的输出:

/etc/init/container-detect.conf:环境容器
/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]&&容器=openvz
/etc/init/mounted-debugfs.conf:env MOUNTPOINT=/sys/kernel/debug
/etc/init/mounted-dev.conf:env MOUNTPOINT=/dev
/etc/init/mounted-proc.conf:env MOUNTPOINT=/proc
/etc/init/mounted-tmp.conf:env MOUNTPOINT=/tmp
/etc/init/munin-node.conf:env DAEMON=/usr/sbin/munin-node
/etc/init/mysql.conf:环境 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:环境 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="已启动"
/etc/init/wait-for-state.conf:env TARGET_GOAL="start"

欲查看详尽的示例,请参阅一些脚本。这里是 nginx.conf:

# nginx

描述“nginx http 守护进程”
作者“菲利普·克洛斯”

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

env DAEMON=/usr/local/nginx/sbin/nginx
环境 PID=/usr/local/nginx/logs/nginx.pid

期望分叉
重生
重生限制 10 5
#永不消失

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

执行$DAEMON

答案4

您的服务的 SystemV/init.d 脚本位于此处:/etc/init.d/<service-name>;它从中加载环境变量/etc/default/<service-name>

例如,关于我的服务,docker我有以下几行/etc/init.d/docker

BASE=docker

if [ -f /etc/default/$BASE ]; then
        . /etc/default/$BASE
fi

这非常清楚地显示了/etc/default/<service-name>文件的加载方式,因此如果您想为您的服务设置环境变量,只需在此文件中设置它们即可。

例如,我的文件/etc/default/docker如下所示:

# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
#   Please see the documentation for "systemd drop-ins":
#   https://docs.docker.com/engine/admin/systemd/
#

# Customize location of Docker binary (especially for development testing).
#DOCKERD="/usr/local/bin/dockerd"

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export DOCKER_TMPDIR="/mnt/bigdrive/docker-tmp"

相关内容