В Linux даны два процесса с известными pIds , один из которых является родителем другого,

Можно ли узнать, ожидает ли родительский процесс завершения дочернего процесса?

Спасибо

1 ответ1

4

Проверьте родительский стек ядра и / или wchan ("канал ожидания")

$ ps -o pid,stat,wchan:24,command 1978243
    PID STAT WCHAN                    COMMAND
1978243 Ss   wait                     bash

$ cat /proc/1978243/wchan 
do_wait

$ sudo cat /proc/1978243/stack 
[<ffffffff8108008d>] do_wait+0x1cd/0x260
[<ffffffff810812ab>] SyS_wait4+0x7b/0xf0
[<ffffffff815f7cf2>] entry_SYSCALL_64_fastpath+0x1a/0xa4
[<ffffffffffffffff>] 0xffffffffffffffff

Это показывает, находится ли процесс внутри системного вызова ядра - если он показывает системный вызов wait , это самый распространенный способ ожидания дочернего процесса.

Обратите внимание, что многие процессы, основанные на событиях , не используют вызов wait() в течение длительного времени - вместо этого они вместо этого ждут в poll() , пока не будет получено какое-либо событие (которое может быть или не быть событием SIGCHLD).

Поэтому это работает только с простыми линейными процессами. Для всего остального вам придется проверить исходный код или что-то подобное.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .