#linux #bash #процесс
Есть ли в bash встроенная функция для ожидания завершения процесса вроде wait(pid), но для не-дочернего процесса? Если нет, то каким образом можно дожидатся окончания процесса? Интересует не механический способ проверки циклом, а что-то вроде прерываний.
Ответы
Ответ 1
Я предполагаю, что автора интересует не произвольный процесс, а некий демон. Если этот демон "честно" создаёт pid-файл, то можно попробовать навесить inotify на удаление этого файла. Тогда, при завершении процесса демона, он будет удалять свой pid-файл, а ОС пошлёт Вам соответствующий сигнал. Но, как очевидно, при аварийном падении демона этот фокус не пройдёт...Ответ 2
Вам нужен цикл ожидания, очевидно же :) while [ $(pgrep $1)>'0' ] do sleep 5 doneОтвет 3
Как вариант можно предложить скрипт, который в цикле отслеживает заданный PID и посылает вызывающему скрипту (его PID передается вторым аргументом) сигнал. Например: #!/bin/bash if [ $# -ne 2 ]; then echo usage: wdog.sh PID-watch PID-signal exit 1 fi while [ -d /proc/$1 -a -d /proc/$2 ] do sleep 1 done [ -d /proc/$2 ] && kill -1 $2 И пример вызывающего скрипта: #!/bin/bash I=0 trap "echo catch Sighup;I=1" SIGHUP ./wdog.sh $1 $$ & echo read loop while read a do if [ $I == 1 ]; then echo end loop I=$I break fi done Следует учесть, что сигнал тут будет обработан в read (поскольку это встроенная команда), однако выход по прерыванию не происходит. Если же скрипт вызвал какую-либо внешнюю команду (grep, cat ...), то обработка сигнала произойдет после ее завершения. Если воспользоваться ответом @alexanderbarakin (и strace у вас работает (по крайней мере мне в Ubuntu пришлось от рута выполнить echo 0 >/proc/sys/kernel/yama/ptrace_scope, чтобы она заработала для отслеживания произвольного процесса с тем же UID)), то цикл ожидания в скрипте wdog.sh можно заменить на strace -qe '' -p $1 2>/dev/nullОтвет 4
в ответах на вопрос WAIT for “any process” to finish приведены некоторые соображения по этому поводу: какого-либо встроенного (или даже просто заведомо работоспособного) средства, конечно, нет. у меня получилось воспользоваться программой strace, как предложили в одном из ответов. манипуляций с псевдо-файловой системой /proc при этом не потребовалось: $ strace -qe '' -p идентификатор.процесса понятно, что «следить» за процессами, запущенными другими пользователями, не получится, пока не запустите strace от имени пользователя root.Ответ 5
вот из этого мануала я узнал следующее: Для досрочного завершения потока можно воспользоваться функцией pthread_cancel. Единственным аргументом этой функции является идентификатор потока. Функция pthread_cancel возвращает 0 в случае успеха и ненулевое значение(код ошибки) в случае ошибки. Функция pthread_setcancelstate определяет, будет ли поток реагировать на обращение к нему с помощью pthread_cancel. То есть получается надо отменить удаление функцией pthread_cancel с помощью pthread_setcancelstate и анализировать какие коды возвращает pthread_cancel, и скорей всего она будет возвращать какой то код ошибки типа поток не найден если его нет и при всем при этом она этот поток не сможет завершить.
Комментариев нет:
Отправить комментарий