Вы могли перенести tmux вокруг passwd:
tmux new-session -ds chpwd passwd
tmux send-keys -t chpwd NEWPASSWORD$'\n'
tmux send-keys -t chpwd NEWPASSWORD$'\n'
Выполненный как корень, конечно.
Bash делает это для Вас. Это уведомит Вас, когда концы процесса путем предоставления Вам назад будут управлять, и это сохранит статус выхода в специальной переменной $?
. Это примерно походит на это:
someprocess
echo $?
См. руководство удара о специальных параметрах для получения дополнительной информации.
Но я предполагаю, что Вы хотите сделать другую работу при ожидании. В ударе можно сделать это как это:
someprocess &
otherwork
wait %+
echo $?
someprocess &
запустит процесс в фоновом режиме. Это означает, что управление сразу возвратится, и можно сделать другую работу. Процесс, запущенный в фоновом режиме, называют заданием в ударе. wait
будет ожидать данного задания, чтобы закончить и затем возвратить статус выхода того задания. Заданиями ссылаются %n
. %+
относится к последнему запущенному заданию. См. руководство удара об управлении заданиями для получения дополнительной информации.
При реальной необходимости в PID, можно также сделать это как это:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
специальная переменная, содержащая PID последнего запущенного фонового процесса.
Один - по общему признанию властный - подход должен использовать strace
:
$ strace -e trace=none -e signal=none -p 12345
будет следить за процессом с PID 12345, не прерывая системного вызова (сначала -e
) и никакие сигналы (второй -e
). После того как процесс выходит регулярным способом, значение выхода будет распечатано.
Если процесс завершается сигналом, strace выходы тихо (когда выполнено с опциями, данными выше). Можно использовать, например. -e signal=kill
изменить это поведение. Отметьте, однако, это -e signal=all
(или, эквивалентно, опуская -e signal
опция), мог бы произвести большую сумму вывода, если сигналы получены и обработаны программой.
Объединение в цепочку выполнения "уведомляет"
$ process; notify $? &
Заметьте это, если процесс выйдет неожиданным способом notify
не будет выполняться
Установка прерываний
Процесс сообщен сигналами другого значения и может реагировать соответственно
#!/bin/bash
process
function finish {
notify $?
}
trap finish EXIT
Вы не ясны, какое уведомление Вы имеете в виду. В сущности это может быть что-либо, что звонит в "звонок", конечно. Один для многих, например. notify-send
от libnotify
библиотека.
$ process; notify-send "process finished with status $?" &
если Ваш процесс, выполненный как deamon, рассмотрите использование выскочки или monit, они - вид стандартных путей:
http://www.alexreisner.com/code/upstart
Они могут контролировать процесс, код выхода, процессы перезапуска, записать журнал...
С ptrace()
можно присоединить трассировщик к процессу (или выполнить новый), установите рычаг с PTRACE_O_TRACEEXIT
(Linux> = 2.5.60) и сон до выхода процесса, затем с PTRACE_GETEVENTMSG
получите статус выхода.
Здесь демонстрационная реализация назвала стопор, я проверил его с attach
опция только и это потребовало, чтобы несколько изменений получили его работа (в конечном счете в случае необходимости, я отправлю код где-нибудь).
wait
работы? Сколько ЦП будет обычно требоваться от системы? – Nir 15.08.2013, 22:31wait
работы. Я знаю, что это не берет значимое количество системных ресурсов. Можно рассмотреть исходный код здесь: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def – lesmana 15.08.2013, 23:03