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