systemd env变种来自可执行脚本

时间:2017-06-19 10:25:30

标签: linux environment-variables systemd

我有以下systemd服务文件:

[Unit]  
Description=My description  

[Service]  
Type=simple  
User=myuser  
ExecStart=/path/to/my/start_script.sh  
ExecStop=/path/to/my/stop_script.sh  
ExecReload=/bin/kill -HUP $MAINPID  
KillMode=process  
Restart=on-failure  
RestartSec=30s  

[Install]  
WantedBy=multi-user.target  

我的 start_script.sh 用于启动java应用程序但我需要从可执行的ksh脚本中获取一些变量 custom_script.sh < / EM>

我尝试了以下systemd params但没有成功:

  • ExecStartPre
  • EnvironmentFile

有没有办法让它发挥作用?

先谢谢大侠。

1 个答案:

答案 0 :(得分:1)

为了使您的Java进程可以访问custom_script.sh中的变量,您必须以某种方式将它们插入到环境中,这是systemd会很满意的。 docs for the EnvironmentFile= directive表示任何不是带=符号的参数赋值语句的行都将被忽略。所以我们需要把你的脚本做下来,这样我们剩下的就是运行后的变量。

您可以做的是创建一个辅助“酒厂”服务,该服务会提取您的custom_script.sh文件,并将环境中的每个值打印到另一个名为custom_script.env的文件中。然后,您可以在EnvironmentFile指令中向Java进程提供“已提取的”环境文件。

因此,如果您的原始服务添加After=Requires=,则

[Unit]  
Description=My description  
After=custom-script-distillery
Requires=custom-script-distillery

[Service]  
Type=simple  
User=myuser  
EnvironmentFile=/path/to/my/custom_script.env
ExecStart=/path/to/my/start_script.sh  
ExecStop=/path/to/my/stop_script.sh  
ExecReload=/bin/kill -HUP $MAINPID  
KillMode=process  
Restart=on-failure  
RestartSec=30s  

[Install]  
WantedBy=multi-user.target 

然后酿酒厂看起来像这样:

[Unit]
Description=My service to distill custom_script.sh to an EnvironmentFile

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c 'set -o allexport; source /path/to/my/custom_script.sh; set +o allexport; unset IFS; set | grep -v "^BASH" > /path/to/my/custom_script.env'