【问题标题】:Cron job generate duplicate processessCron 作业生成重复进程
【发布时间】:2013-08-20 23:34:09
【问题描述】:

我的 cron 如下:

$ crontab -l

0,15,30,45 * * * * /vas/app/check_cron/cronjob.sh 2>&1 > /vas/app/check_cron/cronjob.log; echo "Exit code: $?" >> /vas/app/check_cron/cronjob.log

$ 更多 /vas/app/check_cron/cronjob.sh

#!/bin/sh

echo "starting script";

/usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/

echo "completed running the script";

$ ls -l /usr/local/bin/rsync

-rwxr-xr-x   1 bin      bin       411494 Oct  5  2011 /usr/local/bin/rsync

$ ls -l /vas/app/check_cron/cronjob.sh

-rwxr-xr-x   1 vas     vas         153 May 14 12:28 /vas/app/check_cron/cronjob.sh

如果我手动运行它...脚本运行良好。

$ /vas/app/check_cron/cronjob.sh 2>&1 > /vas/app/check_cron/cronjob.log; echo "Exit code: $?" >> /vas/app/check_cron/cronjob.log

如果由 crontab 运行,cron 会在 24 小时内生成超过 30 个双进程,直到我手动杀死它们。

$ ps -ef | grep cron | grep -v root | grep -v grep

vas 24157 24149   0 14:30:00 ?           0:00 /bin/sh /vas/app/check_cron/cronjob.sh
vas 24149  8579   0 14:30:00 ?           0:00 sh -c /vas/app/check_cron/cronjob.sh 2>&1 > /vas/app/check_cron/cronjob.log; ec
vas 24178 24166   0 14:30:00 ?           0:00 /usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/
vas 24166 24157   0 14:30:00 ?           0:01 /usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/

请给我建议如何使系统运行良好并且系统中没有仍在运行的进程 并且进程正常停止。

BR, 诺埃尔

【问题讨论】:

  • 您的脚本是否及时完成?如果它们需要很长时间才能运行,那么它们会累积。
  • 脚本必须在几秒钟内完全完成......并且有一个工作来检查是否有重复的进程。问题是为什么cron作业中有重复的进程,

标签: linux shell cron


【解决方案1】:

您提供的输出看起来很正常,前两个进程只是 /bin/sh 运行您的 cron 脚本,后两个是 rsync 进程。

如果 crontab 与您用于测试的用户不是同一用户,这可能是权限问题,导致脚本在从 cron 运行时需要更长的时间。您可以将-v-vv 甚至-vvv 添加到rsync 命令以增加输出,然后在每次运行后观察cron 电子邮件。

防止多个脚本运行实例的一种方法是使用某种锁定文件,我发现使用mkdir 来达到此目的很容易。

#!/bin/sh

LOCK="/tmp/$0.lock"

# If mkdir fails then the lock already exists
mkdir $LOCK > /dev/null 2>&1
[ $? -ne 0 ] && exit 0
# We clean up the lock when the script exists for any reason
trap "{ rmdir $LOCK ; exit 0 ; }" EXIT

echo "starting script";

/usr/local/bin/rsync -r /vas/app/check_cron/cron1/ /vas/app/check_cron/cron2/

echo "completed running the script";

只需确保在操作系统启动时进行某种清理,以防它无法自行清理 /tmp。如果脚本崩溃、被杀死或在操作系统重新启动时正在运行,锁可能会保留在那里。

【讨论】:

  • 感谢 Olafur ...我会测试它。 $ ps -ef | grep cron | grep -v root | grep -v grep | wc -l 46
  • 看看 /tmp 目录中的锁是否很旧,然后脚本真的卡住了,然后你必须调试它卡住的原因。
【解决方案2】:

你为什么担心?有什么不工作吗?从父进程ID我可以推断出shell(PID = 24157)分叉了一个rsync(24166),而rsync分叉了另一个rsync(24178)。看起来这就是 rsync 的运作方式......

肯定不是 cron 启动两个 rsync 进程。

【讨论】:

  • 如果 2 或 3 个进程是可以的。但是我在系统中发现是:$ ps -ef | grep cron | grep -v root | grep -v grep | wc -l 46
  • 然后我怀疑脚本有问题。从 cron 运行它与从命令行运行它不同。例如。 cron-started 它没有控制终端(从 stdin 读取时挂起),未设置 PATH,环境极小,等等。也许它会在一天中积累僵尸?
【解决方案3】:

你可能想看看Fat Controller而不是 CRON

它的工作方式与 CRON 类似,但具有各种内置策略来管理您要运行的脚本实例重叠的情况。

例如,您可以指定当前正在运行的实例被终止并启动一个新实例,或者您可以指定一个宽限期,在该宽限期内当前正在运行的实例必须在终止它并启动一个新实例之前完成。或者,您可以指定无限期等待。

网站上有更多示例和完整文档: http://fat-controller.sourceforge.net/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 2013-07-18
    • 1970-01-01
    • 2015-02-05
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多