Sudo - Ожидание ребенка и получение PID ребенка - PullRequest
3 голосов
/ 15 февраля 2012

Кажется, что где-то между sudo 1.7.2p2 и 1.7.4p5 изменилось поведение ожидания выполнения процессов. Похоже, что в старых версиях sudo запускает новый процесс, а затем завершает работу. В более новых версиях он запускает новый процесс, а затем ждет его. Здесь есть небольшая дискуссия об этом: http://www.sudo.ws/pipermail/sudo-users/2010-August/004461.html, в которой упоминается, что он не должен нарушать поддержку сеанса PAM.

Это изменение нарушает один из моих сценариев, который использует sudo для выполнения команд в фоновом режиме, так как в более старой версии sudo команда, которую я хочу выполнить, будет фоновой, а в новой версии - сама sudo, которая будет фоновой.

Например, процесс вернул $! в этом случае для сна

user@localhost$ sudo -V
Sudo version 1.7.2p2
user@localhost$ sudo -u poweruser sleep 60 &
[1] 17491
user@localhost$ ps -fp $!
UID        PID  PPID  C STIME TTY          TIME CMD
poweruser 17491 17392  0 16:43 pts/0    00:00:00 sleep 60

В то время как в данном случае это для sudo

user@localhost$ sudo -V
Sudo version 1.7.4p5
user@localhost$ sudo -u poweruser sleep 60 &
[1] 792
user@localhost$ ps -fp $!
UID        PID  PPID  C STIME TTY          TIME CMD
root       792 29257  0 16:42 pts/3    00:00:00 sudo -u poweruser sleep 60

Можно ли получить идентификатор процесса для дочернего процесса, выполняемого sudo версии 1.7.4p5? $! переменная возвращает PID для sudo, а запуск sudo с опцией -b, похоже, не делает дочерний PID доступным. Можно ли (без перекомпиляции sudo) изменить поведение sudo, чтобы оно не ожидало дочерних процессов?

Спасибо

1 Ответ

1 голос
/ 15 февраля 2012

Это, конечно, хак, и он не устанавливает $ !, но вы можете повторить pid команды:

$ sudo sh -c 'echo $$; exec sleep 60'

Я предполагаю, что ваше объяснение старого поведения несовершенно верно, и что sudo просто исполняет команду, а не разветвляется и выходит.Повторное выполнение pid и выполнение нужной команды может сработать, но вам могут потребоваться творческие перенаправления.Например:

#!/bin/sh

exec 3>&1
pid=$( sudo sh -c 'echo $$; exec sh -c "{ sleep 1;
    echo my pid is $$; }" >&3 &')
echo Child pid is $pid

В приведенном выше примере вы теряете pid sudo ... но найти его будет несложно.

...