【问题标题】:piping cronjob output to logger prevents it from exiting将 cronjob 输出管道传输到记录器可防止其退出
【发布时间】:2013-11-27 12:59:58
【问题描述】:

一个小例子来说明我的问题。默认外壳是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 保持打开状态的情况下将输出通过管道传输到记录器?

【问题讨论】:

    标签: shell cron sh


    【解决方案1】:

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

    请注意,并非所有 shell 都标准提供 $PPID。

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多