В настоящее время я нахожусь в процессе написания оболочки. Я запускаю процессы и использую обработчик сигналов SIGCHLD
для их очистки (ожидания) по завершении.
Все работает, за исключением случаев, когда я запускаю процессы, повышающие привилегии с помощью sudo
. В этих случаях я никогда не получаю сигнал SIGCHLD
, поэтому я никогда не узнаю, завершилось ли выполнение процесса.
Когда я получаю такую команду, как sudo ls
, я запускаю программу sudo
и затем указываю ls
в качестве параметра. Я выполняю это выполнение с помощью execvp
.
Если я взгляну на ps -aux
после того, как моя оболочка выполнила sudo ls
, я увижу следующее:
root 4795 0.0 0.0 4496 1160 pts/29 S+ 16:51 0:00 sudo ls
root 4796 0.0 0.0 0 0 pts/29 Z+ 16:51 0:00 [ls] <defunct>
Итак, sudo
запустился и получил pid = 4795
, а ребенку (ls) был назначен 4796
. Ребенок выполнил свою задачу и теперь сидит в состоянии зомби. sudo
, похоже, не хочет пожинать плоды зомби-процесса и просто сидит там.
Я хотел бы знать, что вызывает такое поведение - я пробовал разные методы очистки этих зомби-процессов, такие как запуск моей оболочки под sudo
и ожидание непосредственно sudo
и PID
, которые выполняет sudo
(4796 в приведенном выше примере). Ни одна из этих техник не сработала.
Как всегда, любые советы приветствуются.
strace(1)
выводsudo(8)
при запуске вашей оболочкой и при запуске стандартной системной оболочкой. Поскольку трассировка возится с разрешениями setuid для исполняемых файлов, вам нужно будет прикрепитьstrace
после запускаsudo
, но до того, как он проделает большую работу;sudo -k
сначала заставитsudo
повторно запрашивать пароль, а пока он ждет, вы можете найти его pid и запуститьstrace -o /tmp/out -f -p <pid>
. - person sarnold   schedule 22.11.2011sudo vi
через bash? Там этого не происходит. - person BSchlinker   schedule 22.11.2011sudo
не полагается исключительно на CHLD, IIRC, но это определенно не поможет. - person pilcrow   schedule 26.11.2011