Linux服务意外死亡

标签 linux bash service daemon systemctl

运行 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(在 start ofc 之后)获得的输出几乎相同

● food.service - Foo Daemon

Loaded: loaded (/etc/systemd/system/food.service; disabled; vendor preset: enabled)

Active: inactive (dead)

Sep 28 14:54:30 john-host systemd[1]: Started Foo Daemon.

Sep 28 14:54:30 john-host foo_main.sh[7376]: foo_main script start in /home/john/bin

Sep 28 14:54:30 john-host foo_main.sh[7376]: << START of foo_script.sh fb loop >>

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

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

Sep 28 14:54:32 john-host foo_main.sh[7376]: foo_main script end

Sep 28 15:24:30 john-host foo_main.sh[7921]: << START of foo_script.sh gb loop >>

Sep 28 15:24:30 john-host foo_main.sh[7921]: << START of foo_script.sh gc loop >>

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

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

最佳答案

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

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

关于Linux服务意外死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46470071/

相关文章:

linux - 无法通过串口读取数据

linux - 使用每个 "compress, gzip, bzip2 and zip"压缩和解压缩文件

linux - 检查参数是否是 shell 脚本中的有效日期时间

php - 每 24 小时运行一次 php 任务

java - 从 Liferay 门户获取文章

android - 如何使用 Android 中的后台服务每 5 分钟获取一次设备位置?

linux - 在 x64 位程序集中执行系统命令?

linux - 如何从 Visual Studio 2010 中远程编译和调试 Linux

bash - "@a"运算符在 shell 扩展中有何用途?

bash - 异步运行ssh sudo