管道cronjob输出到记录器可以防止它退出

时间:2013-11-27 12:59:58

标签: shell cron sh

显示我的问题的一个小例子。默认shell为bash,但我的脚本使用sh。这是我为 root 添加的crontab行(start.sh必须以root身份运行):

*/1 * * * * "/home/mydir/start.sh" "/home/mydir" 2>&1 | logger

start.sh的内容:

#!/bin/sh
nohup "$1"/start_sleeper.sh "$1" &

start_sleeper.sh的内容:

#!/bin/sh
/usr/bin/python -u "$1"/sleeper.py "$1" >> "$1"/log &

sleeper.py每隔5秒打印一条消息,该消息将附加到同一目录中的log。它应该继续在后台运行,而start.sh可以继续,然后退出。它确实继续使用nohup "$1"/sta..行以下的任何代码,但由于某种原因它不会退出:

pgrep -lf sleeper.py
22303 /usr/bin/python -u /home/mydir/sleeper.py /home/mydir
pgrep -lf start.sh
22296 /bin/sh -c "/home/mydir/start.sh" "/home/mydir" 2>&1 | logger

当我从crontab中省略2>&1 | logger时,start.sh退出。在这种情况下,有没有办法将输出管道输出到记录器而没有start.sh保持打开状态?

1 个答案:

答案 0 :(得分:0)

我的解决方案是在/bin/kill -SIGHUP $PPID结束添加start.sh。 cronline产生2个进程,一个用于实际start.sh,另一个用于管道输出到logger。 SIGHUP打破了这两者之间的“联系”,因此它们都会退出。看起来很丑陋,但我没有想法。

请注意,所有shell中都没有标准的$ PPID。