Запустите 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 секунд.

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

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

например:

/home/your/script.sh &
Flinth
источник
7
в этом случае, когда терминал закрыт, процесс запускается так, /home/your/script.shкак будто он не отделен от своего «родителя», а просто «заземлен». Используйте, nohupчтобы отделить его по-настоящему.
Иззи
Плохо, я не знал об этом, но когда я тестировал свой Debian, команда продолжала выполняться после закрытия оболочки, которая его запустила: /
Flinth
1
Я не уверен, где именно и когда прикреплен фоновый процесс. Но если вы, например, войдете в систему на удаленной машине, она определенно остановится, как только вы выйдете из системы (кроме случаев, когда она сама себя демонизировала ). Поэтому, чтобы быть на 100% уверенным, вы предпочитаете использовать nohup- который также записывает весь (теперь невидимый) вывод в файл, который nohup.outнаходится в каталоге, из которого вы запустили команду.
Иззи
Хорошо, хорошо, спасибо за ваши объяснения ^^
Flinth
Этот ответ может работать нормально в сочетании с jobsкомандой. Довольно часто я хочу иметь возможность вернуться к процессу оболочки после его создания.
Джангофан