Как получить статус завершения процесса из другого сеанса оболочки?
Предположим, я запускаю команду в одном сеансе оболочки, например bash -c 'apt-get update && apt-get upgrade'
, Через 5 минут я решил выйти на улицу, чтобы перекусить, и понял, что забыл добавить какую-то форму механизма уведомления о том, был ли выход успешным или неудачным.
Ну а что мне теперь? Если бы только я мог запросить у другого терминала состояние выхода этой другой команды (или, в частности, этого PID), возможно, я мог бы в конце концов отобразить какое-то всплывающее окно. Итак, вопрос: как я могу запросить состояние выхода уже запущенного процесса с другого терминала?
Другими словами,
ПОДАРОК, что у меня запущен процесс в терминале А, и известен его PID
КОГДА я выполняю какую-то команду в терминале B
ПОТОМ я должен быть в состоянии знать, завершается ли процесс в терминале со статусом выхода 0 или статусом выхода>1.
1 ответ
Использование 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, пожалуйста, оставьте там отзыв, если вы найдете это полезным.