我有一个简单的系统(在 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/
其中至少接受start
和stop
作为启动和停止二进制文件/守护程序/任务的参数。首先有一个框架脚本,您可以将其用作模板来/etc/init.d/skeleton
编写该脚本。