Як запустити роботу cron лише один раз?


14

У мене є робота, яка працює назавжди в той момент, коли вона починається. Тому я хочу запустити його лише один раз після введення його у файл "crontab -e" та збереження його (або) кожного разу, коли перезавантаження відбудеться.

Як цього досягти?

Відповіді:


22

Якщо ви хочете, щоб команда була запущена один раз на більш пізню дату, використовуйте atкоманду.

Якщо ви хочете, щоб команда була запущена один раз під час завантаження системи, правильним рішенням є використання будь-якого:

  • системні RC-сценарії (/etc/rc.local)
  • crontab зі @rebootспеціальним префіксом (див. manpage)

Останнє є єдиним варіантом для некорінного користувача.


2
+1 для згадки @reboot.
Алекс Холст

Я завжди вважаю за краще використовувати /etc/rc.local, якщо це можливо ... Я підозрюю, що @reboot насправді виконує команди при запуску crond, а не завантажуванні системи. Тонка, але можлива різниця.
MikeyB

припустимо, я вписав @reboot "cmd ............." у файл crontab і зберег його. Чи розпочнеться ця команда зараз? (або) Починається вона лише після перезавантаження?
Рама Вадакатту

Спробуйте і подивіться :) Що вам, мабуть, потрібно буде зробити, це покласти його в crontab, а потім at now
розкласти

Гарна відповідь. Я завжди про це забуваю @reboot.
Білл Вайс

9

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


1
Ви також можете використовувати rc.local. Команди в /etc/rc.local "виконуватимуться після всіх інших сценаріїв init. Ви можете помістити власні речі ініціалізації в rc.local, якщо ви не хочете робити повний стиль стилю Sys V".
Джо

Джо: хороший дзвінок.
Білл Вайс

Як зупинити процес, розпочатий командою? (Я знаю, вбити ідентифікатор процесу, побачивши список ідентифікаторів процесу, використовуючи "команду ps", чи працює це також для "в команді"). Чи легко створювати власні сценарії?
Рама Вадакатту

Так обом. Усі процеси можна зупинити, використовуючи kill(якщо ви отримали дозволи на це, що ви робите для власних процесів). Створити сценарій init дуже просто. Шукайте /etc/init.d/сценарій, який не дуже довгий, і моделюйте його після нього, або Google making init scripts (your distribution).
Білл Вайс

1
Безліч дистрибутивів включає скелет скелета ( /etc/init.d/skeletonна openSuSE), який ви можете адаптувати для свого використання.
MikeyB

3

Робота, яка працює лише один раз і працює назавжди, поки ти не скажеш їй померти, називається "демон". Зазвичай вони запускаються через init-скрипти в /etc/init.d/.

Якщо ваша робота закінчується в якийсь момент і її можна вважати одноразовою роботою, то ви можете поглянути на команду at. Наприклад, якщо я хотів запустити команду find в 22:00 сьогодні ввечері, і тільки це я зробив би:

$ at 10PM
at> find /root > /root/find_results.list
at> <EOT>
job 3 at 2010-02-10 22:00

1

Погляньте на команду at


що буде, коли системи перезавантажать? Чи потрібно мені знову ввести "за командою"?
Рама Вадакатту

Записи команди at не втрачаються через перезавантаження. ibm.com/developerworks/linux/library/l-job-scheduling.html - це цікаве вступ до планування роботи
Домінік

@Rama Vadakattu: "Запис команди не втрачається через перезавантаження". ... які ще не виконані. Дивіться відповідь MikeyB .
Призупинено до подальшого повідомлення.

ОК, я зроблю більше досліджень з цього приводу.
Рама Вадакатту
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.