Intereting Posts
Ubuntu MATE 16.04 зависает через несколько секунд после загрузки, застревает на экране входа Несколько команд в sshpass Разрешить группе r / w в папке, принадлежащей конкретному пользователю Сценарий Bash и stdin Как изменить сайт по умолчанию, размещенный по ip-адресу сервера plesk linux? Скрипт, запущенный daemon, не может найти общую библиотеку Откуда sysctl -a распечатать все параметры ядра? Каббал умирает на NixOS в KVM раскол столбца после n-го символа Жареный зола PS1 не расширяется Есть ли разница между установкой переменной окружения в пустую строку и ее установкой? Суммируйте значения в столбце, кроме заголовка Как я могу использовать команды ruby ​​gem, такие как bundler, когда ruby ​​устанавливается менеджером пакетов nix? Удалите x строк до и y строк после n-й строки (которая соответствует шаблону) в файле Как я могу загрузить систему в корневой сеанс, а затем запустить команду в этом сеансе?

использование sudo создает другой процесс

Я написал имена сценариев оболочки testShell.I запускаю эту оболочку с помощью команды:

sudo sh testShell 

Затем я использую ps -ef|grep testShell|grep -v grep

чтобы проверить созданные процессы. Я считаю, что для меня созданы два процесса:

 imcas@ubuntu:~$ ps -ef|grep testShell|grep -v grep root 5687 32482 0 11:37 pts/1 00:00:00 sudo sh testShell root 5688 5687 48 11:37 pts/1 00:00:08 sh testShell 

Из ppid я знаю, что один из них является родителем, а другой – дочерним. Теперь я хочу убить исполняемый скрипт оболочки. Что мне делать? Просто убейте ребенка или я должен убить родителя? Я нахожу, что если я убью ребенка с помощью kill -9 5688 , то и ребенок, и родитель будут убиты. Но если я убью родителя с помощью kill -9 5687 , просто будет убит родитель. Кто-нибудь мог сказать мне причину?

В Linux, когда родительский процесс убит, его дочерний процесс становится сиротой. Но тогда в «сердечном» процессе init принимается тот сиротский процесс, который позволяет ему действовать.

Чтобы убить процессы родительского и дочернего процессов, вы можете использовать:

 pkill -TERM -P <parent's PID> 

(Примечание: сиротский процесс отличается от процесса зомби, но это для другого вопроса 🙂

Родитель ( sudo ) уведомляется о выходе дочернего процесса. Поскольку единственной целью родителя было запустить этот дочерний процесс, он завершается. Другие процессы не прекращаются только потому, что вы убиваете дочерний процесс.

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