繁体   English   中英

Linux服务意外死亡

[英]Linux Service unexpectedly died

运行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.servicestart sudo systemctl status food.service之后)获得的输出几乎相同

●food.service-Foo守护程序

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

有效:无效(无效)

9月28日14:54:30 john-host systemd [1]:启动了Foo Daemon。

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]:<<循环foo_script.sh fb >> 1

9月28日14:54:31 john-host foo_main.sh [7376]:<<循环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]:<<循环foo_script.sh gb >> 1

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

另一种解决方案RemainAfterExit=yes/etc/systemd/system/food.service使用Type=oneshot + RemainAfterExit=yes

查看https://www.freedesktop.org/software/systemd/man/systemd.service.html以引用即时服务类型。

如下所示的服务文件也应解决您的问题。

[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

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

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

在没有背景与符号的情况下,位于foo_main.sh

显然,真正的服务与此截然不同,但我现在明白了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM