Як отримати статус виходу з іншого сеансу оболонки?


7

Припустимо, я запускаю команду в одному сеансі оболонки, наприклад bash -c 'apt-get update && apt-get upgrade'. Через 5 хвилин я вирішу вийти на закуску і зрозумію, що забув додати певну форму механізму оповіщення щодо того, чи був вихід успішним чи невдалим.

Ну, що мені тепер? Якби тільки я міг запитати з іншого терміналу статус виходу цієї іншої команди (або конкретно, цього PID), можливо, я міг би зрештою відобразити якесь спливаюче вікно. Отже, питання: як я можу запитати статус виходу вже запущеного процесу з іншого терміналу?

Іншими словами,

ВІДПОВІДИ, що у мене є запущений процес в терміналі A І його PID відомий

КОЛИ я виконую якусь команду в терміналі B

Тоді я повинен мати можливість знати, чи закінчується процес у терміналі A зі статусом виходу 0 або статусом виходу> 1.


Отже, ви хочете, щоб щось (команда оповіщення, що повідомляє про код виходу?) Запускалася, коли визначений, довільний процес A (даний PID) закінчується, після приєднання до нього "спостерігача" за допомогою команди B? Ми не можемо припустити, що A - це фонове завдання, яке працює в тій же оболонці, де ви пізніше введете B, ні?
Байт-командир

@ByteCommander Правильно. Це робота на передньому плані.
Сергій Колодяжний

Я не думаю, що неможливо отримати зворотний код від дитини іншої оболонки. Ви можете використовувати waitкод фонового процесу у вашій поточній оболонці після його закінчення, але я не зміг знайти нічого, що дозволило б запитувати інші оболонки. Просто моніторинг того, чи є процес все ще запущений, і підняття попередження після його завершення також знову тривіально, але не з'ясування його вихідного коду. Єдиний спосіб, про який я міг би подумати, вимагав би підготувати оболонку PROMPT_COMMANDдля зберігання останнього коду виходу у тимпфілі чи подібному доступному місці. Це був би варіант?
Байт-командир

@ByteCommander Nope. Не готуйте термінал A, робіть все з терміналу B. І повірте, можливо.
Сергій Колодяжний

1
Ну, це було б постійною підготовкою (редагування .bashrc один раз), але добре. З нетерпінням чекаю відповіді, якщо ви знайдете її.
Байт командир

Відповіді:


8

Використовуйте straceнаступним чином:

sudo strace -e trace=none -e signal=none -q -p $PID

Тут не цікавлять ні системні дзвінки, ні сигнали, тому ми говоримо straceігнорувати їх із -eвиразами та подавляти повідомлення про стан -q. straceприєднується до процесу з PID $PID, чекає нормального виходу та видає свій вихідний статус таким:

+++ exited with 0 +++

Простим ifвиразом для виклику будь-якого типу повідомлення може бути:

if sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
  echo yeah
else
  echo nope
fi

Приклад виконання

# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah

# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope

Більшість кредитів припадає на цю відповідь на U&L , будь ласка, залиште резюме там, якщо ви вважаєте це корисним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.