Как получить статус завершения процесса из другого сеанса оболочки?

Предположим, я запускаю команду в одном сеансе оболочки, например 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, пожалуйста, оставьте там отзыв, если вы найдете это полезным.

Другие вопросы по тегам