Вы получили обратно приглашение (см. Пятую строку блока кода) - и , затем вы получили результат. Когда вы в третий раз набрали , введите , вы все еще были «в приглашении оболочки» .
Теоретически оболочку можно запрограммировать на повторную выдачу приглашения при завершении фонового процесса. Но
echo 1
и 1
, появившееся на вашем терминале,
ваш курсор вернулся влево край экрана,
, и стало неочевидно, что вы все еще "в приглашении оболочки".
И оболочка переднего плана не знает
, когда фоновая задача пишет на экран. Исторически оболочка не знает, когда вы набираете команду; она знает, только когда вы набираете , введите . (Это может все еще иметь место в некоторых контекстах.) Таким образом, оболочка не узнает , если вы набираете третью команду
(sleep 3; echo someth { {1}}
и было бы очень сложно, если бы вы получили новое приглашение оболочки , когда вы набирали команду.
Возможно, подойдет короткий пример службы 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.
cron не подходит для этой работы.
Правильным инструментом является диспетчер служб , который, кроме того, включает в себя идею автоматического -перезапуска служб после их завершения. (Не все. )К таким менеджерам услуг относятся:
Создается определение службы, соответствующее диспетчеру служб, который запускает сценарий бесконечного цикла, и добавляется. Для некоторых менеджеров служб это просто небольшая run
программа (, обычно сама по себе являющаяся сценарием ), который выполняет сценарий бесконечного цикла. Менеджеры служб выполняют запуск, мониторинг и автоматический -перезапуск.
Несколько диспетчеров служб легко использовать для управления службами -для каждого пользователя, а также для управления -всей системой, и это можно настроить как -определение пользовательской службы для службы, которая работает как собственной учетной записи и может управляться без привилегий суперпользователя (, которые требуются для управления общесистемными -службами ).
@FelixJN
Предупреждение. :Включение selinux может помешать запуску вашего скрипта. Чтобы это заработало, я
переместил его в /usr/local/bin
(, который является папкой, поддерживаемой selinux )
и отредактировал /etc/systemd/system/infinite_script.service
, чтобы исправить ExecStart
соответствующим образом
запустил sudo restorecon -rv /usr/local/bin
, чтобы передать эту информацию в selinux, и
побежал systemctl daemon-reload
к наконец
перезапустить службуsystemctl start infinite_script.service