Вынеси работу nohup на передний план

14

Рассмотрим следующее nohupвыполнение:

nohup script.sh > script.out &

Есть ли способ выйти из терминала, восстановить соединение, вернуть процесс на передний план и взаимодействовать с ним с помощью клавиатуры?

Адам Матан
источник

Ответы:

7

Если вы хотите запустить скрипт, запустить его без выхода, беспокоящего ваш терминал, а затем запустить его позже, чтобы взаимодействовать с ним, вы можете взглянуть на мультиплексор терминала. В зависимости от вашей системы я бы порекомендовал tmuxили screen. Вы можете найти некоторую информацию о том, как их использовать, по ссылкам ниже:

tmux:

экран:

редактировать: добавлены ссылки для праймеров tmux

Гас Э
источник
+1 Отличный инструмент, о котором я не знал. Большое спасибо.
Адам Матан
19

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). Это не может быть возвращено на передний план, потому что передний план больше не существует.

souravc
источник
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 изменяется, поэтому это не первоначальный потомок).
Руслан
4

Я поддержу использование терминального мультиплексора, но tmux , а не screen. Экран, по сути, не поддерживается. Его конфигурация - темное искусство, вероятно, впервые записанное в приложении к Некрономикону. Попытка написать собственный конфиг - это проблеск Cthulu. Шутки в сторону. Посмотрите на файлы .screenrc людей . Чтобы быть уверенным, есть способы опосредовать мерзость экрана конфигурации. Бёбу делает замечательную работу как завеса между смертными пользователями и нечестивым кодом. Он поставляется с разумными цветами, интерфейсом меню и, возможно, самое главное, строкой состояния.

Но, как я уже сказал, я рекомендую tmux . Это все еще требует некоторой незначительной конфигурации, но это хорошо задокументировано , и ваш файл конфигурации не будет выглядеть как бред. Кроме того, вы начинаете с цветов и строки состояния. Сравните мои файлы screenrc и tmux.conf:

djeikyb
источник
0

Если вы просто хотите посмотреть вживую, что может подойти вам:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
кон-е использование
источник
0

Любая команда 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.

Судип Бхандари
источник