如何在不使用 crontab 的情况下定期执行脚本?

如何在不使用 crontab 的情况下定期执行脚本?

如何像 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出色文档。systemdsystemd

答案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将不会被调用,并且重新安排也不会发生。

相关内容