我是 Shell 脚本的新手。
我正在尝试以某种方式 cron 一个作业,该作业将获取一个 url 一次来触发一项任务,然后每 2 分钟获取另一个 url 以保持任务处于活动状态。
到目前为止,我已经设法使第一个 url 正常工作,问题出在第二个 url wget 每 2 分钟重复一次,持续 1 小时。
我尝试在 .sh 脚本中包含 cron,就像我在其他地方看到建议的那样,例如
*/2 * * * * wget $url
但终端只是将其抛出并显示错误“没有这样的文件或目录”。
实现这个目的的最佳方法是什么?
答案1
正如@Fiximan 和@steeldriver 所建议的,另一种选择是wget
循环运行 1 小时:
COUNT=0
while [ $COUNT -lt 30 ]; do
wget $url
sleep 120
COUNT=$((COUNT + 1))
done
请注意,包含此代码的脚本必须使用 来运行#!/bin/bash
,而不是#!/bin/sh
。
答案2
在脚本文件 (.sh) 中,您可以创建一个循环,运行 1 小时(3600 秒),暂停 2 分钟(120 秒)。
# Initialize seconds variable
seconds=0
# Loop until 1 hour is done
while [[ $seconds < 3600 ]]; do
seconds="$(($seconds + 120))"
sleep 120
wget $url
done
我将该wget
命令作为最后运行的命令,以便它在运行最后一个命令后不必等待额外的 2 分钟wget
。
答案3
应将这一行*/2 * * * * wget $url
放入您的 crontab 中以使其工作。您应该首先输出当前的 crontab,将这一行附加到其中并将其安装为新的 crontab。
例如,可以使用以下命令来完成:
crontab -l >/tmp/cronfile
echo "*/2 * * * * wget $url" >>/tmp/cronfile
crontab /tmp/cronfile
第一个命令可以输出“no crontab for用户名“如果 stderr 上当前没有定义 crontab,为了避免这种情况,您可以将 stderr 重定向到/dev/null
如下位置:
crontab -l >/tmp/cronfile 2>/dev/null
请注意,运行上述代码将导致wget
操作重复永远即,直到您手动将其从 crontab 中删除。如果您希望它在 1 小时后自动删除,则必须创建一个在 1 小时后从 crontab 中at
删除的作业:wget
at now +1hour <<EOF
crontab -l | grep -v wget | crontab -
EOF