我有一台 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 进行查询sleep
(6575
如上例所示):
$ 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
启动您的程序。