Как мне запустить команду cron, которая имеет вечный цикл?

Вы получили обратно приглашение (см. Пятую строку блока кода) - и , затем вы получили результат. Когда вы в третий раз набрали , введите , вы все еще были «в приглашении оболочки» .

Теоретически оболочку можно запрограммировать на повторную выдачу приглашения при завершении фонового процесса. Но

  1. это не очень помогло бы. Ваша проблема в том, что когда фоновое задание выполнило echo 1 и 1 , появившееся на вашем терминале, ваш курсор вернулся влево край экрана, , и стало неочевидно, что вы все еще "в приглашении оболочки". И оболочка переднего плана не знает , когда фоновая задача пишет на экран.
  2. Исторически оболочка не знает, когда вы набираете команду; она знает, только когда вы набираете , введите . (Это может все еще иметь место в некоторых контекстах.) Таким образом, оболочка не узнает , если вы набираете третью команду

     (sleep 3; echo someth { {1}} 

    и было бы очень сложно, если бы вы получили новое приглашение оболочки , когда вы набирали команду.

0
28.05.2019, 14:46
3 ответа

Возможно, подойдет короткий пример службы systemd.

Это наш бесконечный скрипт, местоположение /path/to/infinite_script, набор исполняемых битов:

#!/bin/bash
while ((1)) ; do
    date >> /tmp/infinite_date
    sleep 2
done

Нет, нам не нужно определять служебный файл:

[Unit]
#just what it does
Description= infinite date service

[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always

[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target

и поместите его в/etc/systemd/system/infinite_script.service

Теперь загрузите и запустите службу (как root):

systemctl enable infinite_script.service
systemctl start infinite_script.service

Служба запущена, и мы можем проверить ее статус

systemctl status infinite_script.service

● infinite_script.service - infinite date service
   Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
 Main PID: 7349 (infinite_script)
    Tasks: 2 (limit: 4915)
   Memory: 1.5M
   CGroup: /system.slice/infinite_script.service
           ├─7349 /bin/bash /path/to/infinite_script
           └─7457 sleep 2

Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.

Теперь если убить скрипт(kill 7349-основной PID )и снова проверить статус:

● infinite_script.service - infinite date service
   Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
 Main PID: 7583 (infinite_script)
    Tasks: 2 (limit: 4915)
   Memory: 1.5M
   CGroup: /system.slice/infinite_script.service
           ├─7583 /bin/bash /path/to/infinite_script
           └─7606 sleep 2

Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.

Итак, обратите внимание, как он был мгновенно перезапущен с новым PID.

И проверьте принадлежность выходного файла:

ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan  300 Mai 28 14:31 infinite_date

Таким образом, сценарий запускается тем пользователем, который указан в служебном файле.

Конечно, вы можете остановить и отключить службу:

systemctl stop infinite_script.service
systemctl disable infinite_script.service

РЕДАКТИРОВАТЬ:

Еще несколько подробностей. :Персональные услуги пользователя могут (по умолчанию )размещаться в $HOME/.config/systemd/user/и управляться соответствующим образом с помощью systemctl --user <commands>. Корень не нужен, как и в случае с личным crontab.

4
28.01.2020, 02:15

мю.

cron не подходит для этой работы.

Правильным инструментом является диспетчер служб , который, кроме того, включает в себя идею автоматического -перезапуска служб после их завершения. (Не все. )К таким менеджерам услуг относятся:

Создается определение службы, соответствующее диспетчеру служб, который запускает сценарий бесконечного цикла, и добавляется. Для некоторых менеджеров служб это просто небольшая runпрограмма (, обычно сама по себе являющаяся сценарием ), который выполняет сценарий бесконечного цикла. Менеджеры служб выполняют запуск, мониторинг и автоматический -перезапуск.

Несколько диспетчеров служб легко использовать для управления службами -для каждого пользователя, а также для управления -всей системой, и это можно настроить как -определение пользовательской службы для службы, которая работает как собственной учетной записи и может управляться без привилегий суперпользователя (, которые требуются для управления общесистемными -службами ).

Дополнительная литература

4
28.01.2020, 02:15

@FelixJN

Предупреждение. :Включение selinux может помешать запуску вашего скрипта. Чтобы это заработало, я

  1. переместил его в /usr/local/bin(, который является папкой, поддерживаемой selinux )

    .
  2. и отредактировал /etc/systemd/system/infinite_script.service, чтобы исправить ExecStartсоответствующим образом

  3. запустил sudo restorecon -rv /usr/local/bin, чтобы передать эту информацию в selinux, и

  4. побежал systemctl daemon-reloadк наконец

  5. перезапустить службуsystemctl start infinite_script.service

0
14.05.2021, 17:18

Теги

Похожие вопросы