5

我的 linux 服务器正在运行带有 Nginx/unicorn 的 Rails 4 应用程序。

我正在使用Whenever gem 来安排任务。一切都正常工作,直到几天前 cron 作业似乎只是停止运行。

这是在我的 schedule.rb 文件中:

every 5.minutes do
    runner "Video.send_to_wistia", environment: 'production'
end

这是我跑步时看到的crontab -l

# Begin Whenever generated tasks for: myapp
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c 'cd /home/myuser/myapp && bin/rails runner -e production '\''Video.send_to_wistia'\'''
# End Whenever generated tasks for: myapp

我已经重启了独角兽。我还确保运行:

whenever --update-crontab myapp

在包含应该运行的操作的 video.rb 文件中,我放置了一些日志代码:

   def self.send_to_wistia
        logger.debug( "Sending videos to wistia at #{Time.now}" )
        ...

我一直在看日志,那里什么也没有。

PS:我的第一直觉是该站点可能在开发模式下运行(无论何时任务未配置为在其中运行),但情况似乎并非如此,因为我现在看到记录进入我的生产数据库。

更新: 作为我的应用程序的用户,当我运行时,service cron status我得到这个:cron: unrecognized service. 但我不确定这是检查用户的 crontab 还是整个系统。

Update2: 这是我运行时看到的pgrep -l cron

410 crond
582 crond
711 crond
879 crond
1021 crond
1188 crond
1320 crond
1404 crond
1509 crond
1648 crond
1805 crond
1829 crond
1936 crond
2090 crond
2196 crond
2235 crond
2388 crond
2491 crond
2523 crond
2673 crond
2773 crond
2907 crond
2971 crond
3068 crond
3195 crond
3256 crond
3386 crond
3496 crond
3554 crond
3686 crond
3839 crond
4041 crond
4137 crond
4375 crond
4453 crond
4657 crond
4753 crond
4991 crond
5036 crond
5287 crond
5335 crond
5609 crond
5620 crond
5891 crond
5918 crond
6186 crond
6203 crond
6468 crond
6501 crond
6781 crond
6786 crond
7080 crond
7084 crond
7368 crond
7375 crond
7658 crond
7667 crond
7964 crond
7965 crond
8246 crond
8559 crond
8647 crond
8841 crond
8932 crond
9136 crond
9232 crond
9444 crond
9515 crond
9745 crond
9813 crond
10097 crond
10100 crond
10395 crond
10539 crond
10680 crond
10975 crond
11029 crond
11260 crond
11325 crond
11559 crond
11629 crond
11855 crond
11936 crond
12153 crond
12246 crond
12438 crond
12739 crond
12756 crond
13038 crond
13085 crond
13337 crond
13380 crond
13622 crond
13663 crond
13920 crond
14017 crond
14205 crond
14301 crond
14503 crond
14596 crond
14788 crond
14939 crond
15086 crond
15260 crond
15382 crond
15542 crond
15680 crond
15953 crond
15963 crond
16253 crond
16263 crond
16547 crond
16548 crond
16839 crond
16846 crond
17130 crond
17134 crond
17416 crond
17430 crond
17711 crond
17715 crond
17993 crond
18013 crond
18288 crond
18298 crond
18570 crond
18596 crond
18865 crond
18892 crond
19147 crond
19190 crond
19453 crond
19475 crond
19735 crond
19773 crond
20030 crond
20058 crond
20313 crond
20356 crond
20608 crond
20641 crond
20890 crond
20939 crond
21185 crond
21224 crond
21467 crond
21522 crond
21762 crond
21807 crond
22044 crond
22105 crond
22339 crond
22401 crond
22621 crond
22699 crond
22927 crond
22984 crond
23209 crond
23283 crond
23504 crond
23568 crond
23786 crond
23866 crond
24081 crond
24151 crond
24363 crond
24449 crond
24658 crond
24734 crond
24940 crond
25032 crond
25235 crond
25317 crond
25517 crond
25617 crond
25812 crond
25913 crond
26095 crond
26211 crond
26401 crond
26496 crond
26683 crond
26794 crond
26978 crond
27079 crond
27260 crond
27377 crond
27555 crond
27662 crond
27837 crond
27960 crond
28132 crond
28245 crond
28414 crond
28543 crond
28709 crond
28828 crond
28991 crond
29127 crond
29296 crond
29423 crond
29546 crond
29721 crond
29841 crond
30014 crond
30136 crond
30322 crond
30418 crond
30733 crond
30767 crond
31015 crond
31071 crond
31314 crond
31358 crond
31596 crond
31692 crond
31892 crond
31983 crond
32174 crond
32283 crond
32469 crond
32568 crond
32751 crond

更新3: 我跑了ps -ef | grep cron,我得到:

root      1404     1  0 Oct31 ?        00:00:00 crond
myappuser    3961  2746  0 10:56 pts/1    00:00:00 grep cron

更新 4: 我跑了/bin/bash -l -c 'cd /home/clippo/clippo2 && bin/rails runner -e production '\''Video.send_to_wistia'\''',这就是我所看到的:

/home/myuser/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands/runner.rb:53:in `eval': No such file or directory - /home/myuser/myapp/tmp/video_uploads/190 (Errno::ENOENT)
    from /home/myuser/myapp/app/models/video.rb:31:in `new'

此错误消息确实令人困惑,因为该目录确实存在并且始终存在。

4

3 回答 3

4

请问您

crontab -l

输出匹配你在你的日程文件中为你的无论何时宝石?

我通常会

每当 -w

任何时候我对我的计划文件进行更改并希望我的 crontab 更新。

尽管您似乎在获取实际的 rb 文件以运行该记录器命令时遇到问题。你可以尝试编辑你的 schedule.rb 来设置一个这样的 :output ->

设置:输出,“/Users/home/rubylogs/vendorcatalog.log”

每 :day, :at => "2:31am" 做

命令“cd /Users/home/automation/Vendor\ 目录;parallel_test -n 1 *.rb”

结尾

并行测试的东西并不真正相关,但你明白了。看看你这样做时是否得到任何输出?这应该告诉你它是否正在运行。

于 2013-11-01T15:10:22.843 回答
2

事实证明这是一场野鹅追逐。cron 可能一直在工作,但是脚本本身出错了(感谢@Arsen7 为我指出了这个方向),看起来它已经停止了。如果您仔细查看上面更新 4 下的错误消息,您会看到...

/home/myuser/myapp/tmp/video_uploads/190

我最初错过了/190应该文件名 (190.MOV) 的 . 但它缺少一个扩展名,并且似乎是一个存在的目录,并导致整个脚本失败。

于 2013-11-02T12:14:31.683 回答
1

作为第一个猜测,可能是您的cron守护程序已停止工作。

这取决于您的系统上安装了哪种类型的 cron,但我猜该命令pgrep -l cron应该列出一些名称中包含“cron”的进程。

另一件事可能是检查系统日志——通常可以在其中/var/log/messages或附近找到。也许其中有一些带有“cron”的行?Agrep -i cron /var/log/messages可能会有所帮助,但这取决于您拥有什么样的系统记录器 - 因此日志文件可能会有所不同 - 以及它的轮换频率(您说过 cron 几天前停止工作)。

更新

看起来你的 crond 正在运行——即使它有很多实例,也可能是或可能不是不寻常的。

现在您可以按照 fedorqui 的建议,确认 crontab 文件中使用的行确实有效。也许它挂起,因此没有创建对 cron 的新调用?

如果命令正常工作,您可能希望查看日志文件 - 系统日志消息(/var/log目录下的内容)或 cron 自己的日志文件(可能您的 cron 守护程序配置为将其消息输出到 - 例如 - /var/log/crond)。

通常,cron 守护程序在运行任务时会输出一条日志消息。它还会在您查看或编辑 crontab 文件时记录。这些消息可能很有用。

如果您在日志文件中找不到任何信息,那么您可以尝试重新启动 cron 服务。我不能告诉你怎么做,因为它取决于你的服务器的配置。

于 2013-11-01T14:32:35.187 回答