Я новичок в написании сценариев оболочки.
Я пытаюсь каким-то образом настроить задание, которое будет получать один URL-адрес один раз для запуска задачи, а другой URL-адрес каждые Через 2 минуты, чтобы задача оставалась активной.
Пока мне удалось заставить работать первый URL без проблем, проблема заключается в том, что второй URL wget повторяется каждые 2 минуты в течение 1 часа.
Я попытался включить cron в сценарий .sh, как я видел, предлагалось в другом месте, например
*/2 * * * * wget $url
, но терминал просто выдает его с ошибкой «нет такого файла или каталога».
Какой лучший способ сделать это?
Как предложили @Fiximan и @steeldriver, другой вариант - запустить wget
в цикле в течение 1 часа:
COUNT=0
while [ $COUNT -lt 30 ]; do
wget $url
sleep 120
COUNT=$((COUNT + 1))
done
Обратите внимание, что сценарий, содержащий этот код, должен запускаться с использованием #! / bin / bash
, а не #! / bin / sh
.
Строку * / 2 * * * * wget $ url
нужно поместить в ваш crontab, чтобы Работа. Сначала вы должны вывести текущий crontab, добавить к нему строку и установить его как новый crontab.
Это можно сделать, например. используя следующие команды:
crontab -l >/tmp/cronfile
echo "*/2 * * * * wget $url" >>/tmp/cronfile
crontab /tmp/cronfile
Первая команда может выводить "no crontab for username " на stderr, если в настоящее время crontab не определен, чтобы избежать этого, вы можете перенаправить stderr на / dev / null
вот так:
crontab -l >/tmp/cronfile 2>/dev/null
Имейте в виду, что выполнение вышеуказанных строк приведет к тому, что операция wget
будет повторяться навсегда , т.е. пока вы не удалите его вручную из crontab. Если вы хотите, чтобы он автоматически удалялся через 1 час, вам необходимо создать задание at
, которое удалит wget
из вашего crontab через 1 час:
at now +1hour <<EOF
crontab -l | grep -v wget | crontab -
EOF
В файле сценария (.sh) вы можете создать цикл, который будет работать в течение 1 часа (3600 секунд) с двухминутной паузой (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
.