(Кроме некоторых средств системы инициализации.)
Бывает нужно запускать программы в какое-то время или по наступлению какого-то события. Если необходимость в запуске частая, или нет возможности находиться за компьютером в нужное время, или невозможно отследить событие вручную - следует наладить автоматический запуск программ.
Традиционные в UNIX средства автозапуска программ в определённое время ("планировщики заданий") - at и cron (и их демоны с суффиксом d). Программа at запускает указанную программу однократно; cron - регулярно по расписанию. Если, конечно, компьютер в нужное время окажется включён. Иначе at запустит запоздавшую команду как можно скорее, а cron - в следующий раз (если разница во времени больше трёх часов, иначе - как можно скорее).
Запланированные команды для at принимаются из заранее подготовленного файла опцией -f или со стандартного ввода. Также программа может принимать новое задание интерактивно, подобно оболочке или cat. Сначала нужно запустить at с аргументами - временем и датой запуска (например, только время 09:30). Появится дополнительное приглашение командной строки. Ввод команды завершают клавишей Enter, а потом сочетанием Ctrl D. Введённая команда будет запущена с помощью упрощённой оболочки /bin/sh.
Формат времени здесь очень разнообразен, может включать небольшие осмысленные выражения на английском, например:
echo 'notify-send "Have a break!"' | at noon tomorrow
Выражение "at noon tomorrow" переводится как "завтра в полдень" (слово at здесь - имя программы, а не часть времени). Программа notify-send показывает на Рабочем столе всплывающее сообщение (popup message) с указанным текстом. В приведённой команде сначала идёт одиночная кавычка, потом двойные, снова двойные (замыкающие) и одиночная (замыкающая первую одиночную). Если сомневаетесь в надёжности такого способа указания даты и времени, задавайте их точно в формате "ЧЧ:ММ ДД.ММ.ГГГГ" (без кавычек и, если нужно, с ведущими нолями), например: 16:45 28.09.2018.
Программа atq показывает пронумерованную очередь заданий (job queue); подробнее о задании - at с опцией -c и номером; удалить задание - atrm и номер. Файлы "at.allow" и "at.deny" в /etc содержат списки пользователей, которым соответственно разрешено и запрещено обращаться к at.
Сама at выполняется со своим окружением (обычно root), поэтому задание на вывод видимого сообщения может провалиться. Программа notify-send не требует дополнительных действий, когда отправляете сообщение себе. Другим программам (например: xmessage или gxmessage, zenity) может понадобиться явно указать переменную дисплея:
echo 'env DISPLAY=:0.0 xmessage "Hello!"' | at 15:10
Чтобы вывести сообщение в текстовую консоль, может понадобиться перенаправить текст в выясненный заранее (программами ps, tty, w) файл консоли:
echo 'echo "Hello!" > /dev/pts/1' | at 09:30
Хотя для отправки сообщения лучше воспользоваться программой wall или write. Или локальной электронной почтой. Документация: man-страницы at, echo, mail или mailx, notify-send, tty, wall, write, xmessage.
Файлы заданий для at и cron хранятся в каталоге /var/spool/cron. Файлы общесистемных настроек cron - /etc/crontab и готовые каталоги, чьё имя начинается на cron, в /etc.
Программа crontab вызывает текстовый редактор (обычно vi) и сохраняет пользовательский файл заданий для cron (имя задавать не требуется, просто вызовите команды сохранения и выхода). Просмотреть список своих cron-заданий - crontab -l (строчная L); редактировать список - crontab -e; полное удаление своего списка - crontab -r.
Файл заданий crontab - текстовая таблица, подобно fstab. Одна строка (запись) на каждое задание. Поля: минута, час, число, месяц, день недели, пользователь (в общесистемном файле), само задание (команда). Звёздочка здесь означает "каждая единица времени" (ежечасно, ежедневно...). Последнюю строку файла традиционно следует завершать клавишей Enter. Для примера просмотрите файл /etc/crontab. Документация: man-страницы cron, crontab(1), crontab(5).
В systemd встроена своя функциональность запуска программ по времени при помощи объектов типа "таймер" (".timer"). Документация: man "systemd.timer".
Чтобы автоматически запускать какие-то программы при запуске текстового сеанса, можно записать их команды в стартовые файлы оболочки (например, в файл "~/.bashrc"). Команды следует записывать как фоновые (заканчивать символом &).
Чтобы автоматически запускать какие-то программы при запуске графического сеанса, их сценарии или файлы ".desktop" нужно поместить в каталог "~/.config/autostart" (общий каталог - /etc/xdg/autostart). Готовые файлы ".desktop" обычно хранятся в каталоге "~/.local/share/applications" (общий каталог - /usr/share/applications/). В программах настройки графических сред могут быть модули для настройки списка автозапускаемых программ. Более старый способ - добавление команд в файл-сценарий "~/.xinitrc" или "~/.xprofile" (аналогично файлу "~/.bashrc").
Набор программ "inotify tools" - средство автозапуска программ по какому-то событию файловой системы (например, если некий файл был изменён). Пример:
while true; \
do inotifywait -e modify report.txt \
&& cp report.txt report-$(date "+%Y.%m.%d_%H:%M:%S").txt; \
done
Эту команду можно было набрать в одну строку без знаков \. Здесь создан так называемый "цикл с предусловием" (while loop). Программа inotifywait наблюдает событие типа "запись" (модификация, modify) для файла "report.txt" и, получив его, завершается успешно (код завершения 0). После этого программа cp делает копию изменённого файла с именем вида report-2018.09.08_14:36:57.txt. Цикл нужен, чтобы бесконечно повторять (перезапускать) пару программ "inotifywait - cp", то есть отслеживать каждый случай записи. Проверьте это: откройте файл "report.txt" в редакторе, внесите изменения и сохраните файл. Прервать - Ctrl C. Функциональность inotify является частью ядра. Документация: man-страницы bash, inotify(7), inotifywait, "Advanced Bash-Scripting Guide" автора Mendel Cooper.