如何像 crontab 一样定期执行脚本但不使用 crontab?
请注意,执行的脚本不应与另一个脚本一起触发并使用“sleep”命令进行安排,我期望它具有与 crontab 相同的功能,但它不应出现在 crontab 列表中,也不应在终端或会话结束时停止,
crontab 完全一样,但没有 croning 它。
答案1
现代的选择是使用systemd
计时器单元。这需要创建一个systemd
定义要定期运行的作业的单元,以及一个systemd.timer
定义作业时间表的单元。
假设您想以普通用户身份运行该作业,请将这些文件放入$HOME/.config/systemd/user
:
我的工作.服务
[Unit]
Description=Job that needs periodic execution
[Service]
ExecStart=/path/to/your/script
我的工作计时器
[Unit]
Description=Timer that periodically triggers my-job.service
[Timer]
OnCalendar=minutely
然后启用新创建的单元,并启动计时器:
$ systemctl --user enable my-job.service my-job.timer
$ systemctl --user start my-job.timer
要验证计时器是否已设置:
$ systemctl --user list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Wed 2016-11-02 14:07:00 EAT 19s left Wed 2016-11-02 14:06:37 EAT 3s ago my-job.timer my-job.service
journalctl -xe
应该显示正在运行的作业的日志条目。
请参阅man systemd.timer
了解配置计时器行为的多种选项(包括随机启动、唤醒计算机、停机持久性、计时器准确性等),并了解有关和单位的man systemd.unit
出色文档。systemd
systemd
答案2
您可以运行脚本at
并让其重新安排自身作为最终指令。例如:
$ cat > $HOME/my.job <<END
do this
do that
cat "$HOME/my.job" | at now + 5 minutes
END
$ sh ~/my.job
要停止作业,请将其从at
队列中删除:
$ atq
5 Wed Nov 2 11:25:00 2016 a zwets
$ atrm 5
或者简单地删除该文件my.job
,这样下次执行cat "$HOME/my.job"
就会出错,所以at
将不会被调用,并且重新安排也不会发生。