我有一个需要每五秒运行一次的脚本。我知道cron
可以按分钟完成任务,但有没有办法每秒运行一次?
Cron只允许至少一分钟。你可能做的是编写一个带有无限循环的Shell脚本来运行你的任务,然后睡5秒钟。这样,您的任务将每5秒运行一次或多或少,具体取决于任务本身需要多长时间。
#!/bin/bash
while true; do
# Do something
sleep 5;
done
您可以使用上面的内容创建my-task.sh
文件,并使用sh my-task.sh
运行它。 (可选)您可以使用supervisor
将其配置为服务,以便在系统引导时启动它等。
这听起来确实像你在做一些你可能不应该做的事情。这感觉错误。
您可以每分钟启动一个cron
作业启动脚本,从而启动12个后台进程:
* * * * * ~/dostuff.sh
dostuff.sh
:
(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &
不过,我的问题是地球上有什么你能不能每隔5秒运行一次?
只需使用一个循环:
while true ; do ./your-script & sleep 5; done
这将启动您的脚本作为后台作业,睡眠5秒,然后再次循环。您可以使用Ctrl-C中止它,或使用任何其他条件而不是true
,例如! test -f /tmp/stop-my-script
仅在文件/tmp/stop-my-script
不存在时循环。
你可以使用GNU packagemcron,一个“Vixie cron”替代品。
http://www.gnu.org/software/mcron/manual/mcron.html#Top
“可以轻松地指定更精细的时间点,即秒。原则上这可以扩展到微秒,但这不会实现。”
使用cacti监控路由器和交换机,但Cron只允许至少一分钟,因此如果一个端口/设备关闭,则在两分钟之前没有警告。
Cron中的最小配置是分钟,您不能将其设置为5秒。你可以使用允许秒数的Quartz。 http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
你可以使用一个SystemD计时器单元,它将触发一个服务 - 你设置为每隔5秒做你想做的事。
假设您的服务单元名为mystuff.service
并安装在/etc/systemd/system
中(检出 SystemD用户服务 如果要替换用户的crontab),那么您可以编写一个计时器单元来在启动时运行该服务然后每5秒钟,像这样:
/etc/systemd/system/mystuff.timer
[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target
然后重新加载systemd配置,启用计时器单元并启动它。
我已经非常成功地完成了这种事情(最终结果是一次几周,直到机器重新启动)。至于我现在正在做什么,更新信息并将其放入缓存 - 每10秒更新一次。
#!/bin/sh
SLEEP=5
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# echo and restart...
exec $0
'exec $ 0'重新启动脚本,但替换正在运行的脚本。它最初可以使用crontab'@reboot'行启动。