Розглянемо наступне 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 &
Можна повернути фонове завдання на перший план в баші, використовуючи 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 , а не екран. Екран для всіх намірів і цілей не підтримується. Його конфігурація - це темне мистецтво, ймовірно, вперше записане в додатку Necronomicon. Спроба написати власну конфігурацію - це лише погляд Ктулу. Серйозно. Огляньте файли .screenrc людей . Щоб бути впевненим, існують способи опосередкувати неприємність екрану конфігурації. Byobu виконує чудову роботу, як завіса між смертними користувачами та нечестивим кодом. Він оснащений розумними кольорами, інтерфейсом меню та, можливо, найголовніше, рядком стану.
Але, як я вже сказав, рекомендую натомість 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 роботи у фоновому режимі: зоопарк, кафка та демон монго. [1], [2] та [3] - відповідні номери завдань для цих завдань.
Ви можете вивести ці завдання на перший план, використовуючи fg %$taskNumber.