Зручно запланувати команду для запуску пізніше?


87

Який простий спосіб запустити команду, скажімо, через 8 годин? Я можу так подумати:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Чи є більш "правильний" спосіб?


Чи щось не так із nohup+ sleep? Чому це "неправильно"?
cprn

Відповіді:


123

Ви можете використовувати atкоманду. Пізніше atвиконайте команди. atУтиліти слід читати команди зі стандартного вводу і згрупувати їх разом , як на робочому місці, повинні бути виконані в більш пізній час.

Зазвичай atвін встановлений за замовчуванням в Ubuntu, але якщо ваш реліз не включає його, встановіть через:

sudo apt-get install at

Для отримання додаткової інформації, параметрів, прикладів та інших даних див. Сховище Ubuntu Manpage Repository

Приклад:

at now +8 hours -f ~/myscript.sh

Ви також можете використовувати зручні скорочення, як-от tomorrowабо noon, як у

echo "tweet fore" | at teatime 

Попередження: Ця команда запустить команду зліва від труби негайно, але представить її вихід лише пізніше. На прикладі також показано, як можна вводити діїat. at -cце спосіб вивчити заплановані дії, які ви можете зручно перелічити з їх кількістю, як з:

at -c 3

19
Може бути корисним додати простий приклад використання, який конкретніше стосується питання оригінального афіші, наприкладat now +8 hours -f ~/myscript.sh
steeldriver

6
Крім того, є at 8:00запуск команди в абсолютний час, і batchдля "коли схоже на те, що комп'ютер не працює"
Simon Richter

4
У випадку, якщо хтось цікавився, teatimeце о 16:00. Чомусь це не згадується в manpages.ubuntu.com/manpages/raring/man1/at.1posix.html, але воно є man atтут і тут manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
День

3
Може, ми можемо відзначити, що утиліта "at" не встановлена ​​за замовчуванням, і якщо хтось хоче її отримати, просто встановіть пакет "at"? Редагувати: У будь-якому випадку я просто відредагував відповідь (також зафіксував посилання на сторінці сторінки).
heartmagic

4
Остерігайтеся, щоб з'єднання в команду запустило команду негайно і заплануйте лише вихід. У мене була 4-годинна помилка 3D-друку, тому що я хотів скласти графік, gpio write 8 1але це виконано відразу.
Maciej Swic

8

Так, ви можете встановити завдання cron.

Наприклад, якщо зараз час 14:39:00, а сьогодні п'ятниця, 30 серпня, ви можете додати наступне завдання cron (виконується через 8 годин) у свій файл crontab за допомогою crontab -eкоманди:

39 22 30 8 5  /path/to/mycommand.sh

Більше про:


3
Гаразд, так, я мав би сказати, що знаю про роботу Cron. Це ще гірше, бо тоді він сидить довкола в кронтабі нескінченно, правда?
Стів Беннетт

4
@ RaduRădeanu: з кроном, обережно, що через кілька років він може знову вистрілити (коли в п’ятницю трапляється ще 30 серпня) ...
Олів'є Дулак

2
Це розумний хак. Однак "at" - це набагато кращий спосіб. Що буде, якщо комп’ютер вимкнений о 14:39?
emory

1
Помилка, це все ще не моя суть. Моя думка полягає в тому, що введений вами текст (я думаю) буквально все ще буде сидіти у вашому кроні після закінчення події, створюючи ще одне завдання очищення для вас.
Стів Беннетт

2
@SteveBennett Так, ти прав. Команда залишиться у вашому, crontabпоки ви її не видалите. Через рік, коли ви забули, хто його туди поставив і чому, вам залишиться чесати голову, цікавлячись, що робити з командою.
Падді Ландау

8

Використовуйте GUI на основі Gnome для cron, atтощо:

Введення CronHowto пропонує використовувати gnome-schedulegui, що набагато приємніше, ніж вводити весь сміття в термінал (особливо для "середніх" користувачів Ubuntu, які не є "power" * nix / bsd користувачами.)

Запустіть його, скориставшись Unity Dash (або меню інших програм) для пошуку запланованих завдань або запуску gnome-schedule.

У системах Ubuntu на базі Gnome інструмент "Заплановані завдання Gnome" (з пакету gnome-графік) у програмах Програми -> Системні інструменти забезпечує графічний інтерфейс із запитом на використання Cron. Веб-сайт проекту знаходиться за адресою http://gnome-schedule.sourceforge.net/ ; це програмне забезпечення можна встановити в Центрі програмного забезпечення або ввівши

sudo apt-get install gnome-schedule

в терміналі.

Використовуючи gnome-scheduleдля сценарію у вашому домашньому каталозі, нову команду "at" буде встановлено за допомогою цього типу вікна:

введіть тут опис зображення


5

Я зрозумів швидкий і брудний спосіб зробити це, перш ніж я дізнався, що atце річ.

Скажіть, ви хочете, щоб ваш сценарій запустився опівдні:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Скажіть, ви хочете, щоб він розпочався завтра опівдні (сьогодні для мене 24 листопада):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Оновлення : Трохи кращий метод: протестуйте лише ті цифри, які вас цікавлять, використовуючи date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...

10
Для двох людей , які upvoted цієї відповіді, будь ласка , використовуйте at, cronабо будь-яке інше додаток реальний планувальника. Планування завдань важке, і не колесо, яке ви повинні винаходити.
dimo414

1
@ dimo414 Що не так з моїм методом?
wjandrea

8
Як мінімум, це зайнято-чекаючи, що марно. Гірше, це не гарантовано, що це правильно; цілком можливо (якщо малоймовірно) умовне пропущення. Базування планувальника на регулярних виразах також дуже схильне до помилок. Це може працювати досить добре , але не має жодних переваг перед at.
dimo414

(Убік: я не спростував вашу відповідь, просто не думаю, що люди повинні її використовувати)
dimo414

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