systemd.exec 中文手册 :http://www.jinbuguo.com/systemd/systemd.exec.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F
设置进程的环境变量, 接受一个空格分隔的 VAR=VALUE 列表。 可以多次使用此选项以增加新的变量或者修改已有的变量(同一个变量以最后一次设置为准)。 设为空表示清空先前所有已设置的变量。 注意: (1)不会在字符串内部进行变量展开(也就是"$“没有特殊含义); (2)如果值中包含空格或者等号,那么必须在字符串两边使用双引号(”)界定。
例如:
Environment=“VAR1=word1 word2” VAR2=word3 “VAR3= w o r d 56 " 设 置 了 " V A R 1 " , " V A R 2 " , " V A R 3 " 三 个 变 量 , 其 值 分 别 为 " w o r d 1 w o r d 2 " , " w o r d 3 " , " word 5 6" 设置了 "VAR1", "VAR2", "VAR3" 三个变量,其值分别为 "word1 word2", "word3", " word56"设置了"VAR1","VAR2","VAR3"三个变量,其值分别为"word1word2","word3","word 5 6”
注意,不要使用环境变量向单元中的进程传递机密信息(例如密码与口令之类)。 一方面,环境变量会通过 D-Bus IPC 暴露给其他非特权客户端; 另一方面,环境变量在概念上也不属于需要保护的机密数据。 此外,因为环境变量能够沿进程树传播,并且能够跨越安全边界(例如 setuid/setgid 程序), 所以可能会将机密数据泄漏给不应访问的进程。
与 Environment= 类似,不同之处在于此选项是从文本文件中读取环境变量的设置。 文件中的空行以及以分号(;)或井号(#)开头的行会被忽略, 其他行的格式必须符合 VAR=VALUE 的shell变量赋值语法。 行尾的反斜杠()将被视为续行符,这与shell语法类似。 若想在变量值中包含空格, 则必须在值的两端加上双引号(")界定。
文件必须用绝对路径表示(可以包含通配符)。 但可在路径前加上 “-” 前缀表示忽略不存在的文件。 可以多次使用此选项,以从多个不同的文件中读取设置。 若设为空,则表示清空 所有先前已经从文件中读取的环境变量。
这里列出的文件将在进程启动前的瞬间被读取, 因此可以由前一个单元生成配置文件, 再由后一个单元去读取它。
从文件中读取的环境变量会覆盖 Environment= 中设置的同名变量。 文件的读取顺序就是它们出现在单元文件中的顺序, 并且对于同一个变量,以最后读取的文件中的设置为准。
将某些 systemd 系统服务管理器进程(PID=1)所持有的环境变量传递给该单元中的进程。 接受一个空格分隔的变量名列表。可以多次使用此选项以传递更多变量。 若设为空,则表示清空先前已设置的所有变量。 如果此处设置的变量并不是系统服务管理器进程(PID=1)所持有的环境变量,那么将会被悄无声息的忽略掉。 注意,此选项仅可用于传递PID=1的 systemd 系统服务管理器进程所持有的环境变量, 因为系统服务单元默认并不自动继承PID=1进程所持有的环境变量。 又因为用户服务单元默认就会自动继承PID≠1的 systemd 用户服务管理器进程的所有环境变量, 所以此选项对于用户服务管理器没有意义。
注意,通过此选项传递过来的环境变量的值会被 Environment= 或 EnvironmentFile= 选项中的同名变量所覆盖。
例如:
PassEnvironment=VAR1 VAR2 VAR3
传递了 “VAR1”, “VAR2”, “VAR3” 三个变量,其值等于PID=1进程所持有的值。
参见 environ(7) 以了解更多环境变量的细节。
明确撤销该单元的特定环境变量。 接受一个空格分隔的变量名(“NAME”)与特定值变量(“NAME=VALUE”)列表。 可以多次使用此选项以撤销更多变量。 若设为空,则表示清空先前已设置的所有列表。 特定值变量(“NAME=VALUE”)表示仅当变量"NAME"的值恰好等于"VALUE"时才会撤销"NAME"变量。 而普通的变量名(“NAME”)则表示无论变量"NAME"的值是什么,都会无条件的撤销"NAME"变量。 注意, 因为 UnsetEnvironment= 的撤销操作发生在向单元内进程传递环境变量前的最后一步, 所以此选项可以撤销来自各种渠道的环境变量,包括: (1)由 Environment= 或 EnvironmentFile= 设置的环境变量; (2)继承自服务管理器全局设置的环境变量(参见 systemd-system.conf(5) 手册中的 DefaultEnvironment= 选项); (3)根据 PassEnvironment= 继承的环境变量; (4)由服务管理器设置的环境变量(例如 $NOTIFY_SOCKET 之类); (5)由 PAM 模块设置的环境变量(如果已设置 PAMName= 的话)。
vi /usr/lib/systemd/system/kylin.service
通过EnvironmentFile=/opt/bdp/kylin/kylinEnv调用环境变量
[Unit]
# 服务描述
Description=cosmo-bdp kylin
After=network-online.target
Requires=network-online.target
[Service]
Type=forking
# 启动命令
ExecStart=/bin/bash -c "JAVA_HOME=/usr/local/java exec /opt/bdp/kylin/bin/kylin.sh start"
EnvironmentFile=/opt/bdp/kylin/kylinEnv
Restart=no
RestartSec=30
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
编辑文件配置的相关环境变量
[root@vm-CentOS75-0-149 bdp]# cat /opt/bdp/kylin/kylinEnv
HADOOP_HOME=/opt/bdp/hdfs
HIVE_HOME=/opt/bdp/hive
SPARK_HOME=/opt/bdp/spark-3.1.2-bin-hadoop3.2
KYLIN_HOME=/opt/bdp/kylin
PATH=/opt/bdp/hive/bin:/opt/bdp/hdfs/sbin:/opt/bdp/hdfs/bin:/opt/bdp/spark-3.1.2-bin-hadoop3.2/bin:/opt/bdp/kylin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vm-CentOS75-0-149 bdp]#
systemctl daemon-reload
systenctl restart kylin