Рассмотрим следующее nohup
выполнение:
nohup script.sh > script.out &
Есть ли способ выйти из терминала, восстановить соединение, вернуть процесс на передний план и взаимодействовать с ним с помощью клавиатуры?
Рассмотрим следующее nohup
выполнение:
nohup script.sh > script.out &
Есть ли способ выйти из терминала, восстановить соединение, вернуть процесс на передний план и взаимодействовать с ним с помощью клавиатуры?
Ответы:
Если вы хотите запустить скрипт, запустить его без выхода, беспокоящего ваш терминал, а затем запустить его позже, чтобы взаимодействовать с ним, вы можете взглянуть на мультиплексор терминала. В зависимости от вашей системы я бы порекомендовал tmux
или screen
. Вы можете найти некоторую информацию о том, как их использовать, по ссылкам ниже:
tmux:
экран:
редактировать: добавлены ссылки для праймеров tmux
nohup не отключает команду от терминала, он игнорирует ваш скриптSIGHUP
и перенаправляетstdout/stderr
его в файлnohup.out
, чтобы команда могла продолжить работу в фоновом режиме после выхода из системы.
nohup
не ставит автоматически команду, выполняемую в фоновом режиме. Это нужно делать явно, заканчивая командную строку символом &
.
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobs
Можно распечатать текущие задания и их статус. Если команда jobs
не может найти ее, она больше не является дочерним процессом этой оболочки.
$ jobs
[1]+ Running nohup ./script.sh &
В bash можно вернуть фоновое задание на передний план, fg
даже если оно запущено с помощью nohup
. Но это не изменит перенаправление вывода, которое все равно будет идти к файлуnohup.out
.
$ fg
nohup ./script.sh
Если вы закрываете оболочку / терминал или выходите из системы, ваша команда больше не является дочерней для этой оболочки. Это относится к init
процессу. Если вы выполните поиск, pstree
вы увидите, что теперь он принадлежит процессу 1 ( init
). Это не может быть возвращено на передний план, потому что передний план больше не существует.
If the command jobs cannot find it, then it is no longer a child process of that shell.
Это неправильно: попробуйте эту последовательность , чтобы увидеть , как: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$
. После этой команды вы все равно увидите sleep
работу с тем же PID, распечатанным, когда вы его породили, пока jobs
ничего не напечатаете. Единственный способ, которым дочерний процесс может перестать быть дочерним, - это потерять своего родителя (тогда сирота становится потомком init
) или разветвиться + выйти (но тогда PID изменяется, поэтому это не первоначальный потомок).
Я поддержу использование терминального мультиплексора, но tmux , а не screen. Экран, по сути, не поддерживается. Его конфигурация - темное искусство, вероятно, впервые записанное в приложении к Некрономикону. Попытка написать собственный конфиг - это проблеск Cthulu. Шутки в сторону. Посмотрите на файлы .screenrc людей . Чтобы быть уверенным, есть способы опосредовать мерзость экрана конфигурации. Бёбу делает замечательную работу как завеса между смертными пользователями и нечестивым кодом. Он поставляется с разумными цветами, интерфейсом меню и, возможно, самое главное, строкой состояния.
Но, как я уже сказал, я рекомендую tmux . Это все еще требует некоторой незначительной конфигурации, но это хорошо задокументировано , и ваш файл конфигурации не будет выглядеть как бред. Кроме того, вы начинаете с цветов и строки состояния. Сравните мои файлы screenrc и tmux.conf:
Если вы просто хотите посмотреть вживую, что может подойти вам:
nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
Любая команда Linux может быть отправлена в фоновом режиме с &
добавлением ' ' в конце.
Для просмотра всех фоновых заданий вы можете выполнить jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
Здесь я выполняю 3 задания в фоновом режиме: zookeeper, kafka и mongo daemon. [1], [2] и [3] являются соответствующими номерами заданий для этих задач.
Вы можете вывести эту задачу на передний план, используя fg %$taskNumber.