Tom*_*Tom 116 scheduling cron
我已经安排了一个 cron 作业每分钟运行一次,但有时脚本需要超过一分钟才能完成,我不希望这些作业开始“堆积”。我猜这是一个并发问题 - 即脚本执行需要相互排斥。
为了解决这个问题,我让脚本查找特定文件(“ lockfile.txt ”)的存在touch
,如果存在则退出,如果不存在则退出。但这是一个非常糟糕的信号量!是否有我应该知道的最佳实践?我应该写一个守护进程吗?
wom*_*ble 156
有几个程序可以自动执行此功能,消除自己执行此操作的烦恼和潜在错误,并通过在幕后使用 flock 来避免过时的锁定问题(如果您只是使用触摸,这是一种风险) . 我过去曾经使用过lockrun
和lckdo
,但现在有flock
(1)(在 util-linux 的新版本中)很棒。它真的很容易使用:
* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job
Run Code Online (Sandbox Code Playgroud)
Phi*_*lds 31
shell 中最好的方法是使用flock(1)
(
flock -x -w 5 99
## Do your stuff here
) 99>/path/to/my.lock
Run Code Online (Sandbox Code Playgroud)
Ami*_*mir 25
实际上,flock -n
可以使用 代替lckdo
*,因此您将使用内核开发人员的代码。
以womble 的示例为基础,您将编写如下内容:
* * * * * flock -n /some/lockfile command_to_run_every_minute
Run Code Online (Sandbox Code Playgroud)
BTW,看代码,所有的flock
,lockrun
和lckdo
做同样的事情,所以它只是一个问题,其中最容易提供给您。
现在systemd已经出来了,Linux系统上还有另一种调度机制:
systemd.timer
在/etc/systemd/system/myjob.service
或~/.config/systemd/user/myjob.service
:
[Service]
ExecStart=/usr/local/bin/myjob
Run Code Online (Sandbox Code Playgroud)
在/etc/systemd/system/myjob.timer
或~/.config/systemd/user/myjob.timer
:
[Timer]
OnCalendar=minutely
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
如果当定时器下次激活时服务单元已经激活,则该服务的另一个实例将不会启动。
另一种方法是在启动时启动一次作业,并在每次运行完成后一分钟启动一次作业:
[Timer]
OnBootSec=1m
OnUnitInactiveSec=1m
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
71184 次 |
最近记录: |