Удобно ли запланировать команду для запуска позже?

87

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

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

Есть ли более "правильный" способ?

Стив Беннетт
источник
Что-то не так с nohup+ sleep? Почему это "неправильно"?
cprn

Ответы:

123

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

Обычно atустанавливается по умолчанию в Ubuntu, но если ваш выпуск не включает его, установите через:

sudo apt-get install at

Для получения дополнительной информации, опций, примеров и прочего смотрите репозиторий справочной системы Ubuntu

Пример:

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для «когда похоже, что компьютер бездействует»
Саймон Рихтер
4
В случае, если кому-то было интересно, teatimeэто в 4 часа дня. По некоторым причинам это не упомянуто в manpages.ubuntu.com/manpages/raring/man1/at.1posix.html, но это man atздесь и здесь manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Дэн
3
Может быть, мы можем упомянуть, что утилита «at» не установлена ​​по умолчанию, и если кто-то еще хочет ее получить, просто установите пакет «at»? Редактировать: Во всяком случае, я просто отредактировал ответ (также исправил ссылку на man-страницу).
heartsmagic
4
Остерегайтесь того, что подключение к at сразу запустит команду и только запланирует вывод. У меня был 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. Это еще более грязно, потому что тогда он сидит в crontab бесконечно, верно?
Стив Беннетт
4
@ RaduRădeanu: cron, будьте осторожны, чтобы он мог снова выстрелить через несколько лет (когда в пятницу будет еще 30 августа) ...
Оливье Дюлак
2
Это умный взломать. Однако «в» - это гораздо лучший способ. Что произойдет, если компьютер будет выключен в 14:39?
Эмори
1
Err, это все еще не моя точка зрения. Я хочу сказать, что введенный вами текст (я думаю) буквально все еще будет находиться в вашем crontab после события, создавая для вас еще одну задачу очистки.
Стив Беннетт
2
@ SteveBennett Да, вы правы. Команда останется в вашем, crontabпока вы не удалите ее. Год спустя, когда вы забыли, кто его там и почему, вам придется почесать голову, размышляя, что делать с командой.
Пэдди Ландау
8

Используйте графический интерфейс Gnome основы для cron, atи тому подобное:

Введение CronHowto предлагает использовать графический интерфейсgnome-schedule , который намного приятнее, чем вводить весь мусор в терминал (особенно для «средних» пользователей Ubuntu, которые не являются «опытными» * nix / bsd пользователями.)

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

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

sudo apt-get install gnome-schedule

в терминале.

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

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

user29020
источник
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
    ...
wjandrea
источник
10
Для двух людей , которые upvoted этого ответа, пожалуйста , используйте at, cronили любое другое приложение реальный планировщика. Планирование задач сложное, и вам не нужно изобретать велосипед.
dimo414
1
@ dimo414 Что не так с моим методом?
17
8
Как минимум, это занятое ожидание, которое расточительно. Хуже того, это не гарантированно будет правильным; вполне возможно (если маловероятно), что условное будет пропущено. Основание вашего планировщика на регулярных выражениях также очень подвержено ошибкам. Это может работать достаточно хорошо , но не имеет никаких преимуществ перед at.
dimo414
(В сторону: я не понизил ваш ответ, я просто не думаю, что люди должны его использовать)
dimo414
4
Еще одна причина для использования at, потому что его рабочие места переживут перезагрузку.
manatwork