Запустите Bash скрипт в фоновом режиме и выйдите из терминала


19

Можно ли запустить команду или терминал выхода Bash-скрипта и НЕ прерывать команду?

Моим решением было запускать cron в определенное время суток, но я уверен, что есть что-то более простое.


Ответы:


45

Чтобы избежать сигналов выхода, распространяющихся на дочерние процессы терминала и оболочки, выполните команду с помощью nohup, то есть:

nohup cmd &

1
Это правильный ответ. Без nohup запущенный процесс все еще считается «дочерним» для процесса терминала и, таким образом, завершается, если терминал закрыт.
Иззи

3
cmd & disownтоже работает, так как &трактуется как ;разделитель команд. Команда disown удаляет соединение между сеансом оболочки bash и командой backgounded.
lornix

2
ЗШ имеет сокращенный для этого: cmd &|.
Четверг

Чтобы это работало, мне пришлось изменить настройки в Terminal.app. В разделе «Профили» выберите свой активный профиль, затем «Оболочка»> «Когда оболочка завершится»> «Закрыть», если оболочка
завершилась корректно

6

Использование screen:

screen -S <session name> -d -m <your command>

после этого вы можете выйти из терминала, а также подключиться к нему:

screen -r <session name>

Больше информации: ссылка


4

Если вы хотите запускать определенную команду или файл каждую секунду или около того в фоновом режиме после выхода из терминала, вы можете попробовать эту простую небольшую вещь;

nohup watch -n5 'bash script.sh' &

Это будет запускать scipt.sh каждые 5 секунд.


1
«nohup» уже покрыт принятым ответом. И я вполне уверен, что спрашивающий упомянул cron, потому что они использовали его, чтобы сказать: «Выполните эту команду через несколько секунд в будущем», а не запускать ее периодически.
Дэвид Ричерби

1
Мой ответ не делает вещи хуже. Увидеть смысл голосования вниз. Нейронных было бы достаточно.
jamietelin

3

Поставьте символ «&» после вашей команды.

например:

/home/your/script.sh &

7
в этом случае, когда терминал закрыт, процесс запускается так, /home/your/script.shкак будто он не отделен от своего «родителя», а просто «заземлен». Используйте, nohupчтобы отделить его по-настоящему.
Иззи

Плохо, я не знал об этом, но когда я тестировал свой Debian, команда продолжала выполняться после закрытия оболочки, которая его запустила: /
Flinth

1
Я не уверен, где именно и когда прикреплен фоновый процесс. Но если вы, например, войдете в систему на удаленной машине, она определенно остановится, как только вы выйдете из системы (кроме случаев, когда она сама себя демонизировала ). Поэтому, чтобы быть на 100% уверенным, вы предпочитаете использовать nohup- который также записывает весь (теперь невидимый) вывод в файл, который nohup.outнаходится в каталоге, из которого вы запустили команду.
Иззи

Хорошо, хорошо, спасибо за ваши объяснения ^^
Flinth

Этот ответ может работать нормально в сочетании с jobsкомандой. Довольно часто я хочу иметь возможность вернуться к процессу оболочки после его создания.
Джангофан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.