0

运行 Ubuntu 17.04,我想要一个systemctl服务来监督一个主bash脚本,其中三个程序(这里由带有参数标记的虚拟脚本代替foo_script)在无限循环下运行(因为可能的程序崩溃)。

foo_main.sh如果从命令行调用主脚本,则可以正常工作;但我试图从中设置的服务很快就会崩溃。

文件foo_script.sh

#!/bin/bash

echo "FooScripting "$1 >> "foo.d/"$1

文件loop.sh

#!/bin/bash

nLoop=0
prgName=$1
prgArg=$2

echo "<< START of "${prgName} ${prgArg}" loop >>"

while :
do
    let nLoop=nLoop+1
    echo "<< looping "${prgName} ${prgArg}" >>" ${nLoop}
    "./"${prgName} ${prgArg}
    sleep 1
done

echo "<< END of "${prgName} ${prgArg}" loop >>"

文件foo_main.sh

#!/bin/bash

echo "foo_main start in "${PWD}

./loop.sh "foo_script.sh" "fb" &
sleep 2
./loop.sh "foo_script.sh" "gc" &
./loop.sh "foo_script.sh" "gb" &

echo "foo_main end"

文件/etc/systemd/system/food.service

[Unit]
Description = Foo Daemon
After = network.target

[Service]
Type = simple
# User = <<USER>>
# PIDFile=/var/food.pid
WorkingDirectory = /home/john/bin
ExecStart = /home/john/bin/foo_main.sh
# ExecStop = killall loop.sh
# ExecReload = killall loop.sh && /home/john/bin/foo_main.sh
# Restart = on-abort

[Install]
WantedBy = multi-user.target

我从每个sudo systemctl status food.service(在 a startofc 之后)获得的输出几乎相同

● food.service - Foo 守护进程

已加载:已加载(/etc/systemd/system/food.service;已禁用;供应商预设:已启用)

活跃:不活跃(死)

9 月 28 日 14:54:30 john-host systemd[1]:启动 Foo 守护进程。

9 月 28 日 14:54:30 john-host foo_main.sh[7376]: foo_main 脚本开始于 /home/john/bin

9 月 28 日 14:54:30 john-host foo_main.sh[7376]:<< foo_script.sh fb 循环开始 >>

9 月 28 日 14:54:30 john-host foo_main.sh[7376]: << looping foo_script.sh fb >> 1

9 月 28 日 14:54:31 john-host foo_main.sh[7376]: << looping foo_script.sh fb >> 2

9 月 28 日 14:54:32 john-host foo_main.sh[7376]: foo_main 脚本结束

9 月 28 日 15:24:30 john-host foo_main.sh[7921]: << foo_script.sh gb 循环的开始 >>

9 月 28 日 15:24:30 john-host foo_main.sh[7921]: << foo_script.sh gc 循环的开始 >>

9 月 28 日 15:24:30 john-host foo_main.sh[7921]: << looping foo_script.sh gb >> 1

9 月 28 日 15:24:30 john-host foo_main.sh[7921]: << looping foo_script.sh gc >> 1

4

2 回答 2

1

另一种解决方案是Type=oneshotRemainAfterExit=yes您的/etc/systemd/system/food.service

查看https://www.freedesktop.org/software/systemd/man/systemd.service.html以参考onshot服务类型。

像下面这样的服务文件也应该可以解决您的问题。

[Unit]
Description = Foo Daemon
After = network.target

[Service]
Type = oneshot
RemainAfterExit=yes
# User = <<USER>>
# PIDFile=/var/food.pid
WorkingDirectory = /home/john/bin
ExecStart = /home/john/bin/foo_main.sh
# ExecStop = killall loop.sh
# ExecReload = killall loop.sh && /home/john/bin/foo_main.sh
# Restart = on-abort

[Install]
WantedBy = multi-user.target
于 2017-09-28T16:00:03.243 回答
0

解决了...服务被停止只是因为它的执行流程以foo_main.sh. 添加类似的东西就足够了

# ...
./loop.sh "foo_script.sh" "endless_dummy_loop"

没有背景与号,在foo_main.sh.

显然,真正的服务与此大相径庭,但我现在明白了。

于 2017-09-28T15:22:34.650 回答