Как настроить cron для запуска файла только один раз в определенное время в будущем? - PullRequest
35 голосов
/ 29 марта 2011

Как настроить cron для запуска файла только один раз в определенное время в будущем?Одна из альтернатив - http://en.wikipedia.org/wiki/At_%28Unix%29, но она далеко не доступна для всех пользователей в стандартных тарифных планах хостинга.Поэтому мне было интересно, есть ли способ сделать это с помощью cron?

Ответы [ 6 ]

47 голосов
/ 21 мая 2015

Вы действительно хотите использовать at.Это сделано специально для этой цели.

echo /usr/bin/the_command options | at now + 1 day

Однако, если у вас нет at, или ваша хостинговая компания не предоставляет к нему доступ, вы можете попросить cron включить код, который делаетубедитесь, что он запускается только один раз.

Установите запись cron с очень конкретным временем:

0 0 2 12 * /home/adm/bin/the_command options

Далее / home / adm / bin / the_command необходимо либо убедиться, что он запускается только один раз.

#! /bin/bash

COMMAND=/home/adm/bin/the_command
DONEYET="${COMMAND}.alreadyrun"

export PATH=/usr/bin:$PATH

if [[ -f $DONEYET ]]; then
  exit 1
fi
touch "$DONEYET"

# Put the command you want to run exactly once here:
echo 'You will only get this once!' | mail -s 'Greetings!' me@example.com
34 голосов
/ 29 марта 2011

Попробуйте выполнить команду 30 марта 2011 года в полночь:

0 0 30 3 ? 2011  /command

ПРЕДУПРЕЖДЕНИЕ : как отмечено в комментариях, столбец year не являетсяподдерживается в стандартных / стандартных реализациях cron.Пожалуйста, обратитесь к ответу TomOnTime ниже, чтобы узнать, как правильно запускать скрипт в определенное время в будущем в стандартных реализациях cron.

14 голосов
/ 21 мая 2015

Вы действительно хотите использовать в. Именно для этого сделано.

echo /usr/bin/the_command options | at now + 1 day

Однако, если у вас его нет или ваша хостинговая компания не предоставляет к нему доступ, вы можете сделать запись cron с самоудалением.

К сожалению, это удалит все ваши записи cron. Однако, если у вас есть только один, это нормально.

0 0 2 12 * crontab -r ; /home/adm/bin/the_command options

Команда crontab -r удаляет вашу запись в crontab. К счастью, остальная часть командной строки все равно будет выполнена.

ВНИМАНИЕ: Это опасно! Удаляет ВСЕ записи cron. Если у вас их много, это удалит их всех, а не только тот, который имеет строку "crontab -r"!

3 голосов
/ 29 марта 2011

Вы можете поместить файл crontab в /etc/cron.d, который будет запускать скрипт, который будет запускать вашу команду, а затем удалить файл crontab в /etc/cron.d. Конечно, это означает, что ваш скрипт должен работать от имени пользователя root.

1 голос
/ 29 марта 2011

Ваш комментарий предполагает, что вы пытаетесь назвать это с языка программирования. Если это так, может ли ваша программа разветвить дочерний процесс, который вызывает sleep, и работает ли?

Как насчет того, чтобы ваша программа вычисляла количество секунд до желаемого времени выполнения и заставила его вызвать shell_exec("sleep ${secondsToWait) ; myCommandToRun");

0 голосов
/ 20 мая 2019

at - правильный путь.

Если у вас нет команды at на машине, и у вас также нет прав на установку, вы можете поместить что-то вроде этого на cron (возможно, с помощью команды crontab):

* * * 5 * /path/to/comand_to_execute; /usr/bin/crontab -l | /usr/bin/grep -iv command_to_execute | /usr/bin/crontab - 

он выполнит вашу команду один раз и после этого удалит ее из cron.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...