Перевірте команду відхилення


10

Я видав ^z; bg; disownпослідовність для того, щоб дозволити мені закрити сеанс ssh, в якому я веду надважливий тривалий процес. Цей процес записує вихідний статус у stderr, і він продовжує це робити навіть після від'єднання (перевірено lsof, stderr fd відкрито для r / w).

Чи є спосіб визначити, що процес справді відмовився (не буде recv SIGHUP, якщо оболонка recvs одна)?


1
Цікаво, чи потрібно для цього перейти на unix.stackexchange.com
Ріліндо

2
Цікаво, чому б не: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Відповіді:


12

У Bash disownкоманда, видана самою собою, видалить фонові (через bgабо &) процеси з активної таблиці завдань та позначить їх, щоб вони не отримували SIGHUP при виході.

Ви також можете передати одне або кілька завдань, щоб скасувати, наприклад disown 1 3. disown -hПрапор корисний , якщо ви хочете , щоб зберегти робочі місця в таблиці, але до сих пір не SIGHUP на виході з системи.

Можна переглянути таблицю завдань, видавши jobsкоманду. Після успішного тла це покаже [1]+ command &. Після відмови від роботи вона більше не відображатиметься в таблиці завдань і більше не вбивається під час виходу. Ви все ще можете переглянути процес з допомогою ps ux, topі інший технологічним розглядає утиліт.

Після відмови від роботи ви можете зачекати, коли воно закінчиться природним чином, або надіслати сигнал killдо PID, щоб зупинити його.

Оскільки Bash просто видаляє завдання зі списку запущених завдань, які потрібно припинити, і файл переходить на stdout та stderr вашого терміналу, все ще відкриті, ви продовжуватимете отримувати вихід із завдання, поки ваш термінальний пристрій не закриється (коли ви вийдете) .

Приклади:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Я зазвичай використовую тільки disownякщо я біжу потенційно тривалий команду на кшталт rsyncчи , cpа потім вирішити , мені потрібно , щоб вийти без припинення його. Якщо ви знаєте, що збираєтеся запускати команду та виходити з системи, ви можете захопити висновок, констатувавши його або teeперенести у файл, запустивши його nohupабо запустивши його screen(що дозволяє вам знову повернути право власності на команду / завершити після цього ).

Приклади:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null

1
+1 Інформативно та з прикладами. Приємно!
Енді Сміт

Дуже інформативний коментар; Ви хочете сказати, що неможливо перевірити відмежування процесу (окрім того, зазначивши, що його більше немає в таблиці завдань)?
mikewaters

1
коли ви запустите detachфонову роботу, вона буде від'єднана :) там насправді немає середини, де запуск її у фоновому режимі нічого не робитиме. перевіряючи, чи jobsпідтверджує, що ви не намагалися від'єднати зупинений процес чи щось подібне.
lunixbochs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.