Cron 运行你的工作

Cron 运行你的工作

我有一台 Ubuntu Server 机器,需要在其中运行 Python 脚本:

  • 启动时,然后每 30 分钟
  • 具有 root 权限
  • 无需登录

我在互联网上搜索,发现我应该用它sudo crontab -e来编辑我的 cron 设置并添加如下一行:

 30 * * * * python3 /myScriptPath/myScriptName.py

我找不到如何告诉 cron 我的脚本必须运行启动时,然后每 30 分钟不是每小时的“hh:30”时间

另外,我应该将脚本存储在哪里?

答案1

编写控制文件并将其放置在/etc/cron.d/myscriptrun

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    /usr/local/bin/myscript.sh

不要使此文件可执行。它是一个控制文件,而不是脚本。


编写 bash 脚本并将其放入/usr/local/bin/myscript.sh

#!/bin/bash

while true ; do

    python3 /myScriptPath/myScriptName.py &
    sleep 30m

done

使其可执行chmod a+x /etc/cron.d/bashscript

&在后台启动作业,因此脚本将休眠 30 分钟。您可以删除和&,这会使脚本在作业结束后休眠 30 分钟。这意味着作业不再以 30 分钟为间隔启动。


Cron 运行你的工作

您不需要启动脚本,cron 会在启动时自动执行该操作。要监视状态,请使用:

$ systemctl status cron*
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-11-12 06:01:27 MST; 1 weeks 6 days ago
     Docs: man:cron(8)
 Main PID: 1115 (cron)
   CGroup: /system.slice/cron.service
           ├─1115 /usr/sbin/cron -f
           ├─1132 /usr/sbin/CRON -f
           ├─1138 /bin/sh -c    /usr/local/bin/eyesome.sh
           ├─1142 /bin/bash /usr/local/bin/eyesome.sh
           ├─1160 /bin/bash /usr/local/bin/eyesome-dbus.sh
           ├─1168 dbus-monitor --system type=method_call, interface=org.freedesktop.ColorManag
           ├─1169 /bin/bash /usr/local/bin/eyesome-dbus.sh
           └─6575 sleep 57207

您的显示器将cron在顶部和底部有内容,但中间sleep没有内容,除非您使用日出/日落多显示器亮度/伽马转换软件。eyesome

要查看你的 Python 作业何时在下一个 30 分钟间隔运行,请对命令的进程 ID 进行查询sleep6575如上例所示):

$ remaining_sleep_time 6575
55923

$ echo $((55923/60))
932

作业唤醒前剩余时间为 55923 秒除以 60 秒(每分钟)= 932 分钟。要获取remaining_sleep_time函数副本,请参阅:

答案2

要让你的 Python 脚本每 30 分钟运行一次,只需使用 while 循环

主程序

import time
while True:
    print("it ran")
    time.sleep(30 * 60) #convert min to seconds

到目前为止,我发现最好的让它全天候运行的程序是导师sudo apt install supervisor)。

首先编辑/etc/supervisor/supervisord.conf并添加以下几行

[program:your_program_name]
command=python3 your_program_directory/main.py
directory=your_program_directory
autostart=true
autorestart=true
stdout_logfile=/var/log/your_program.log
stderr_logfile=/var/log/your_program_error.log
user=root

然后运行supervisorctl update添加并supervisorctl start your_program_name启动您的程序。

相关内容