如何编写 shell 脚本来 wget 一次 url,然后每两分钟 wget 第二个 url,持续 1 小时

如何编写 shell 脚本来 wget 一次 url,然后每两分钟 wget 第二个 url,持续 1 小时

我是 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

相关内容