【问题标题】:Cron tab pattern to run a script once in a year/ once in lifetime [closed]Crontab 模式每年运行一次脚本/一生一次[关闭]
【发布时间】:2018-01-25 03:17:34
【问题描述】:

我正在寻找应该每年运行一次我的 python 脚本的 crontab 模式。下面是我希望通过 crontab 触发脚本的日期和时间。

日期:2017 年 8 月 16 日,时间:5:00PM(今年该指定时间只触发一次脚本)

有人可以帮我解决这个问题吗?

注意:我实际上正在寻找应该在后台触发我的脚本一次并让它运行的东西(因为我的脚本有无限循环,所以一旦触发并在后台保持进程活跃应该会很好)。为此,我使用了“at”命令(通过谷歌搜索,我看到“at”作业在特定时间触发一次,并且将保持活动状态,直到/除非服务器/系统重新启动,这对我来说很好)。但看起来“在”工作没有按预期工作。我在太平洋标准时间下午 12:20 开始“at”工作,这应该让我的脚本继续运行,并且我的脚本预计会在太平洋标准时间下午 1:15 发送输出。为了测试这一点,我在下午 1:00 关闭了 SSH 会话。在关闭之前,我看到输出“atq”显示由 at 触发的作业。但是后来当我再次重新进入服务器时,我没有看到任何作业在“at”下运行。

有人可以帮我解决这些问题之一吗?最终,我正在寻找一种解决方案,以使该过程在后台永远存在。

【问题讨论】:

  • 如果你想让一个进程永远活着,你应该使用一个进程监督系统——systemd(在大多数新的 Linux 发行版上),launchd(在 MacOS 上),Upstart(如果支持),@ 987654321@等cron是错误的工作工具; atd,同样。
  • ...当你的程序退出时,一个真正的进程监督系统会立即得到通知(所以它不需要偶尔轮询),会知道它如何退出,​​并且将为用户提供方法来指示他们是否希望进程保持运行、停止运行、运行一次并允许退出(如果选择)等。
  • @CharlesDuffy 你能给出这个监督的例子/语法/用法吗?是否有任何日志来检查进程是否正在运行?即使 ssh 退出会话,这是否也能让进程保持活动状态?谢谢!
  • 每个工具都有自己的用途;哪个合适取决于您的目标操作系统。您知道您的目标操作系统附带哪个初始化系统吗?
  • @chaitanya,请参阅fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet 了解命令行用法的一些提示,fedoraproject.org/wiki/… 了解有关添加您自己的服务文件的高级指南,if i> 你的 Linux 发行版基于 systemd。

标签: python linux automation cron


【解决方案1】:

Cron 不适合这个,因为它基于特定的时间间隔运行程序。

一个干净的解决方案是使用主管:http://supervisord.org/

通过你的包管理器安装supervisor,使你的脚本可执行,并将它添加到/etc/supervisor/conf.d/$YOUR_SCRIPT_NAME.conf,然后重启supervisor。

[program:$YOUR_SCRIPT_NAME]
command=$PATH_TO_YOUR_SCRIPT
autostart=true
autorestart=true

您也可以在配置文件中设置日志和错误输出文件的位置:http://supervisord.org/configuration.html

【讨论】:

  • 非常感谢@Eric 提供的详细信息...让我看看这个
【解决方案2】:

让我们开始创建您需要的系统:

首先你需要为你的 python 代码创建一个运行脚本:

/usr/local/bin/my_runner

#!/bin/bash
python /path/to/my/script

$sudo chmod +x /usr/local/bin/my_runner

那么你需要创建/usr/local/bin/startup_runner

#!/bin/bash
echo "@reboot    /usr/local/bin/my_runner" >> /var/spool/cron/crontabs/root
crontab -u root -l | grep -v '/usr/local/bin/startup_runner'  | crontab -u root -

$sudo chmod +x /usr/local/bin/startup_runner

在此结束时,您必须在 2017 年 8 月 16 日,时间:下午 5:00 去找第一个来电者

$sudo crontab -e

将以下内容添加到 crontab 文件的末尾

0 17 16 8 *    /usr/local/bin/startup_runner

这对你来说很好用,关于脚本有什么问题吗?

【讨论】:

  • 感谢您的回复。 “startup_runner”脚本会重新启动我的服务器吗?然后在启动时是否将 crontab 设置为在 2017 年 8 月 16 日触发脚本,时间:下午 5:00?
  • 如果没有,你能解释一下 startup_runner 脚本在这里做什么吗? crontab 模式会在下午 5:00 触发吗?我只是担心时间。
  • startup_runner 是告诉 crontab 每次重启时 my_runner 必须运行的脚本。
  • 在crontab中@reboot的意思是,在系统启动时运行脚本
  • at Aug-16-2017, Time: 5:00 PM script startup_runner 执行,因此系统知道在 Aug-16-2017, Time: 5:00 PM 之后,每次重启时,my_runner 中的代码必须执行,我认为这正是您所需要的
猜你喜欢
  • 2020-05-21
  • 2011-07-20
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2018-11-10
  • 2012-06-30
相关资源
最近更新 更多