Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 将作业输出传送到记录器可防止其退出_Shell_Cron_Sh - Fatal编程技术网

Shell 将作业输出传送到记录器可防止其退出

Shell 将作业输出传送到记录器可防止其退出,shell,cron,sh,Shell,Cron,Sh,一个小例子来说明我的问题。默认shell是bash,但我的脚本使用sh。这是我为root添加的crontab行(start.sh必须作为root运行): start.sh的内容: #!/bin/sh nohup "$1"/start_sleeper.sh "$1" & #!/bin/sh /usr/bin/python -u "$1"/sleeper.py "$1" >> "$1"/log & start\u.sh的内容: #!/bin/sh nohup "$1"

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

start.sh的内容

#!/bin/sh
nohup "$1"/start_sleeper.sh "$1" &
#!/bin/sh
/usr/bin/python -u "$1"/sleeper.py "$1" >> "$1"/log &
start\u.sh的内容

#!/bin/sh
nohup "$1"/start_sleeper.sh "$1" &
#!/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
保持打开的情况下将输出输送到记录器?

我的解决方案是在
start.sh
端添加
/bin/kill-SIGHUP$PPID
。cronline生成2个进程,一个用于实际的
start.sh
,另一个用于管道输出到
记录器
。SIGHUP中断了这两者之间的“连接”,因此它们都将退出。看起来很老套,但我已经没有主意了

请注意,$PPID并非在所有shell中都是标准可用的