我正在尝试启动一个需要将环境变量设置为特定路径的服务。我在“/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"