为什么我的应用程序在没有 nohup 的情况下会死掉?

为什么我的应用程序在没有 nohup 的情况下会死掉?

我有一个简单的系统(在 Debian 上运行),它通过从 /etc/init.d/rc.local 调用脚本来工作

在 rc.local 的底部,我调用 myScript.sh 来设置一些东西,然后启动一个像这样的二进制文件:

./myBinary > /dev/null 2>&1 &

它运行良好一段时间,但一段时间后 myBinary 退出。但是,如果我修改脚本来执行此操作:

nohup ./myBinary > /dev/null 2>&1 &

运行良好(我测试了大约8个小时)。

根据我的理解,SIGHUP当控制进程的终端关闭时发送,并且 nohup 导致该信号被忽略。

看起来,我的软件正在发送 SIGHUP,但我不明白为什么。有人可以解释一下吗?

编辑:这是实际的脚本

#!/bin/bash
clear
/home/pi/hdmi-switcher/hdmi-switcher version
/home/pi/hdmi-switcher/update.sh
printf "Starting switching daemon..."
cd /home/pi/hdmi-switcher
./hdmi-switcher > /dev/null 2>&1 &
printf "\tOK\n"
printf "Starting video... "
sleep 5
printf "\tOK\n"
omxplayer --loop --no-osd -b -o both /home/pi/hdmi-switcher/video.mp4 > /dev/null 2>&1
clear

死去的东西是hdmi-switcher。 omxplayer没有问题。

答案1

如果您调用二进制文件 in /etc/rc.local,请注意它rc.local被称为 as /bin/sh -e-e意味着如果脚本中任何未经测试的命令失败,脚本将立即退出。您在后台调用二进制文件,脚本中的另一个命令可能会以非 0 的退出代码退出。这会导致您的二进制文件被叹服。

根据联机帮助页,未经测试的命令:

如果命令用于控制 if、elif、while 或 Until,则认为该命令的退出状态已被显式测试;或者如果命令是“&&”或“||”的左侧操作数操作员。

$ command                   # untested
$ command || echo failed    # tested
$ if [ command ]; then...   # tested, also while and until loops
$ [ command ] && echo ...   # tested

此外,该rc.local文件放置在错误的位置,您不应该再使用它,它已被弃用。相反,您应该使用系统启动配置机制。由于您使用 Debian,因此它是 SysV-init-style。要干净地做到这一点,请创建一个脚本,/etc/init.d/其中至少接受startstop作为启动和停止二进制文件/守护程序/任务的参数。首先有一个框架脚本,您可以将其用作模板来/etc/init.d/skeleton编写该脚本。

相关内容