Как запустить работу cron только один раз?

14

У меня есть работа, которая работает всегда, как только она начинается. Поэтому я хочу запустить его только один раз после ввода его в файл "crontab -e" и сохранения его (или) всякий раз, когда происходит перезагрузка.

Как этого добиться?

Рама Вадакатту
источник

Ответы:

22

Если вы хотите, чтобы команда запускалась один раз позднее, используйте atкоманду.

Если вы хотите, чтобы команда запускалась один раз при загрузке системы, правильное решение - использовать либо:

  • системные RC-скрипты (/etc/rc.local)
  • crontab со @rebootспециальным префиксом (см. man-страницу)

Последний вариант - единственный вариант для пользователя без полномочий root.

MikeyB
источник
2
+1 за упоминание @reboot.
Алекс Холст
Я всегда предпочел бы использовать /etc/rc.local, если это возможно ... Я подозреваю, что @reboot фактически запускает команды при запуске crond, а не при загрузке системы. Тонкая, но возможная разница.
MikeyB
Предположим, я ввел @reboot "cmd ............." в файл crontab и сохранил его. Эта команда начнется сейчас? (или) запускается только после перезагрузки?
Рама Вадакатту
Попробуйте и посмотрите :) Что вам, вероятно, понадобится сделать, это поместить его в crontab, а затем запланировать немедленное выполнение с помощьюat now
MikeyB
Хороший ответ. Я всегда забываю о @reboot.
Билл Вайс
9

Вы можете использовать в (1), чтобы запустить работу в какой-то момент в будущем. Однако, если вы хотите запустить что-то при загрузке, и оно продолжит работать само по себе, может быть, вам нужна запись в /etc/init.d/ для этого? Это позволит вам запустить его при загрузке.

Билл Вайс
источник
1
Вы также можете использовать rc.local. Команды в /etc/rc.local «будут выполняться после всех других сценариев инициализации. Вы можете поместить свои собственные элементы инициализации в rc.local, если вы не хотите выполнять весь процесс инициализации в стиле Sys V».
Джо
Джо: хороший звонок.
Билл Вайс
Как остановить процесс, запущенный по команде? (Я знаю, убить идентификатор процесса после просмотра списка идентификаторов процесса с помощью команды "ps", это также работает для "команды"). Легко ли создавать собственные сценарии?
Рама Вадакатту
Да, обоим. Все процессы могут быть остановлены с помощью kill(при условии, что у вас есть разрешения для этого, что вы делаете для своих собственных процессов). Создание сценария инициализации действительно легко. Ищите /etc/init.d/сценарий, который не очень длинный и смоделируйте ваш после него, или Google для making init scripts (your distribution).
Билл Вайс
1
Многие дистрибутивы включают в себя скелетный скрипт ( /etc/init.d/skeletonна openSuSE), который вы можете адаптировать для своего использования.
MikeyB
3

Работа, которая выполняется только один раз и выполняется до тех пор, пока вы не скажете ей умереть, называется «демон». Обычно они запускаются через сценарии инициализации в /etc/init.d/.

Если ваша работа заканчивается в какой-то момент и может считаться одноразовой работой, то вы можете посмотреть на команду at. Например, если бы я хотел запустить команду поиска в 10 вечера сегодня вечером, и только один раз я бы сделал:

$ at 10PM
at> find /root > /root/find_results.list
at> <EOT>
job 3 at 2010-02-10 22:00
CarpeNoctem
источник
1

Посмотрите на команду

Dominik
источник
что произойдет, когда система перезагрузится? Мне снова нужно вводить "по команде"?
Рама Вадакатту
Записи команды не будут потеряны при перезагрузке. ibm.com/developerworks/linux/library/l-job-scheduling.html - интересное введение в планирование работы
Доминик,
@Rama Vadakattu: «Записи команды at не будут потеряны при перезагрузке». ... это еще не было выполнено. Смотрите ответ MikeyB .
Приостановлено до дальнейшего уведомления.
Хорошо, я сделаю больше исследований по этому вопросу.
Рама Вадакатту