我有以下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但没有成功:
有没有办法让它发挥作用?
先谢谢大侠。
答案 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'