我有一个Python脚本,我想从cronjob运行,然后检查每一分钟,看它是否仍在运行,如果没有,然后再次启动它。

Cronjob是:

/usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py

有一些信息,但大多数答案并没有明确详细说明整个过程,例如:

使用cron job检查python脚本是否正在运行

例如,在这种情况下,它没有说明如何运行初始过程并记录PID。 不幸的是,这给我留下了很多问题。

因此,任何人都可以给我一个如何做到这一点的简单指南吗?

例如,需要完整的shell脚本,启动脚本的命令,等等。

#1楼 票数:3 已采纳

这并不难。 首先设置crontab以每分钟运行一次检查:

* * * * * /home/mydir/check_and_start_script.sh

现在在/home/mydir/check_and_start_script.sh

#!/bin/bash
pid_file='/home/mydir/script.pid'
if [ ! -s "$pid_file" ] || ! kill -0 $(cat $pid_file) > /dev/null 2>&1; then
  echo $$ > "$pid_file"
  exec /usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py
fi

这将检查是否存在具有上次运行脚本的进程ID的文件。 如果它在那里,它会读取pid并检查进程是否仍在运行。 如果没有,那么它将当前运行的shell的pid放在文件中,并在同一进程中执行python脚本,终止shell。 否则它什么都不做。

不要忘记让脚本可执行

chmod 755 /home/mydir/check_and_start_script.sh

#2楼 票数:1

你实际上应该退后一步,思考你为什么以及为什么这样做

你需要从cron实际启动你的long_running程序吗? 我问的原因是你然后写另一个程序(观察者)启动你的long_running程序。 我希望你看到你真的不需要cron来启动你的long_running程序。

所以你拥有的是一个观察者每分钟开始并且如果它没有运行则启动long_running程序。

现在你需要真正理解你想要做什么,因为有很多方法可以做到这一点。 如果这是一个练习观察者可以调用ps并在那里运行并开始运行。 在bash中你可以做到

[ -z "$(ps -ef | grep -v grep | grep myprogname)" ] && { echo runit;  }

你只需用名称替换myprogname,然后使用在后台启动long_running代码的命令运行它 - 也许吧

但是你应该使用另一种工具。 systemd,daemontools或其他

#3楼 票数:1

现在有一种更好的方法可以通过名为flock的实用程序直接从单行内的cron任务执行此操作。 flock会在运行你的app之前获得一个锁,并在运行后释放它。 格式如下:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile <your cron job>

对于您的情况,这将是:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/bin/python2.7 /home/mydir/public_html/myotherdir/script.py

-n告诉它如果无法获取锁定则立即失败。 还有-w <seconds>选项,如果在给定的时间范围内无法获取锁定,它将失败。

 * * * * /usr/bin/flock -w <seconds> /tmp/fcj.lockfile <your cron job>

  ask by the_t_test_1 translate from so

未解决问题?本站智能推荐:

1回复

使用crontab在Django中运行python脚本

我的Django项目中有一个脚本,需要每5分钟运行一次。 我正在使用此cron模块运行myproject / myapp / cron.py中存在的名为“ cron.py”的脚本 但是,当我运行服务器时,脚本根本没有运行(没有输出),但是当我在执行“ python manage.py c
2回复

在Beagelboneblack中使用Cron运行python脚本

我将此行添加到 crontab -e New.py 代码很简单,在这里创建一个文本文件是它的代码 当我使用 shell 测试执行代码时,它可以正常工作,当我使用 echo 测试 Cron 到文本文件时,Cron 也可以正常工作,并且我将 python 文件权限设置为可执行,但仍然无法正常工作
2回复

错误的路径导致python程序使用crontab运行

我在Linux下的python中有一个脚本需要确定当前的工作目录。 执行此操作的程序部分是: 当我运行该程序时,它给了我正确的答案: 但是当我使用crontab运行它时,它给了我: 即使我把它放在更深的文件夹中,也会产生相同的路径。 有人知道会出现什么问题吗?
1回复

Python脚本在bash中运行,但不在cron中运行?

我编写了一个python脚本,该脚本可进行reddit(使用PRAW),特定的subreddit,并使用youtube-dl从Youtube下载播客片段。 我将脚本放在/ bin文件夹中,因此可以在bash的任何位置运行它。 问题在于它可以在bash中正常运行,而在cron中则完全不能运行。
1回复

Scrapy(Python)与cron一起运行时抛出ImportError

我正在用cron运行一个抓痒的蜘蛛,但是它抛出一个ImportError异常: 奇怪的是,当我运行由cron运行的脚本时,它运行良好。 cron设置为 脚本是 我正在按如下所述使用CrawlerProcess类: http ://doc.scrapy.org/en/latest/
3回复

可执行的Python脚本不能从crontab运行

我试图让 Python 脚本从 crontab 运行,但它不会。 该脚本位于/home/osmc/python/test.py 我用 ... chmod 744 test.py使脚本可执行 ls -l给出了这个: # which python给/usr/bin/python 这是我在 root 下
1回复

在Raspi上从cron运行时,经过测试的python程序失败

我在RASP PI 2B [Jessie lite]上有一个python程序,该程序在终端命令行上可以正常运行。 但是,当尝试从cron运行时,它将失败,如下所述。 我已经设置了MTA和日志记录。 从系统日志: 1月20日15:10:01卡尔顿CRON [2189]: (pi)
1回复

CronJob的pythonpickle问题

我正在使用python pickle创建对象并存储在配置文件中。 没有cron作业,我可以运行脚本并生成config.pkl。 但是,一旦将其放在cron作业中,就无法生成config.pkl,但是会生成日志“调用generateConfig”。 该文件具有执行权限。 以下是函数和cr