Выполнение единственного исполняемого файла с sudo добавляет два процесса в списке процессов

Я записал программу, которая получает пакеты от сетевого интерфейса. Поскольку это слушает сетевой адаптер, я должен выполнить его с sudo. Вопрос, почему, когда я выполняю его, он добавляет два процесса к списку процессов?

Примечание: lwdpi моя программа

Перед выполнением:

ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ ps ax | grep lwdpi
 4665 pts/21   S+     0:00 grep --color=auto lwdpi
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ 

Execution:
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ sudo ./lwdpi -i enp5s0
2016:10:26 11:07:29 ::   192.168.1.25   9918  -->     239.1.99.222   9918    UDP
2016:10:26 11:07:29 ::  192.168.1.111   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::  192.168.1.153   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::  192.168.1.154   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::   192.168.1.88   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:30 ::   192.168.1.60   5353  -->      224.0.0.251   5353    UDP
2016:10:26 11:07:37 ::  192.168.1.131  17500  -->  255.255.255.255  17500    UDP
2016:10:26 11:07:37 ::  192.168.1.131  17500  -->    192.168.1.255  17500    UDP
2016:10:26 11:07:37 ::  192.168.1.169   5546  -->     192.168.1.38     53    UDP
2016:10:26 11:07:37 ::  192.168.1.169  30955  -->     192.168.1.38     53    UDP
2016:10:26 11:07:38 ::  192.168.1.110  17500  -->  255.255.255.255  17500    UDP
2016:10:26 11:07:38 ::  192.168.1.110  17500  -->    192.168.1.255  17500    UDP
2016:10:26 11:07:42 ::  192.168.1.169  57189  -->     192.168.1.38     53    UDP
2016:10:26 11:07:42 ::  192.168.1.169  26072  -->     192.168.1.38     53    UDP
2016:10:26 11:07:42 ::  192.168.1.169  41674  -->   199.30.228.113     80    TCP
2016:10:26 11:07:43 ::  192.168.1.169  41676  -->   199.30.228.113     80    TCP
2016:10:26 11:07:43 ::  192.168.1.169   7190  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  30029  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  41678  -->   199.30.228.113     80    TCP
2016:10:26 11:07:43 ::  192.168.1.169  64975  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  12625  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  29973  -->     192.168.1.38     53    UDP
2016:10:26 11:07:43 ::  192.168.1.169  53300  -->     216.58.211.4    443    TCP
2016:10:26 11:07:43 ::  192.168.1.169  41682  -->   199.30.228.113     80    TCP
.
.
.

Процессы перечисляют в то время как выполнение:

ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ ps ax | grep lwdpi
 4685 pts/22   S+     0:00 sudo ./lwdpi -i enp5s0
 4686 pts/22   S+     0:00 ./lwdpi -i enp5s0
 4691 pts/21   S+     0:00 grep --color=auto lwdpi
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ 

Поскольку Вы видите выше, после выполнения, процессов с PID = 4685 и PID = 4 686 добавленных к списку процессов. Почему? Я не сделал назвал мою программу в нем!

6
задан 26 October 2016 в 01:09

2 ответа

Когда Вы делаете:

sudo ./lwdpi -i enp5s0
  • sudo родительский процесс, это fork(2)s ребенок, которые затем делают execve(2) с ./lwdpi как исполняемое имя

  • так lwdpi sudoдочерний процесс

Это приводит к двум процессам, как Вы видите, каждый sudo и другой lwdpi.

Лучший способ видеть детали состоит в том, чтобы проверить PPID (идентификатор родительского процесса) также:

ps -eo pid,ppid,args | grep '[l]wdpi'

Вы будете видеть это lwdpiродитель sudo самостоятельно.


Вот sudoмодель процесса, от man sudo:

Когда sudo выполняет команду, он называет ветвление (2), настраивает среду выполнения, как описано выше и называет execve системный вызов в дочернем процессе. Основной процесс sudo ожидает, пока команда не завершила, затем передает статус выхода команды близкой функции и выходам политики безопасности.

Если плагин входа ввода-вывода настроен или если политика безопасности явно запрашивает это, новый псевдотерминал (“имущество”) создается, и второй процесс sudo привык к релейным сигналам управления заданиями между существующим имуществом пользователя и новым имуществом, в котором выполняется команда. Этот дополнительный процесс позволяет, например, приостановите и возобновите команду. Без него команда была бы, в каком POSIX называет “осиротевшую группу процесса” и он не получил бы сигналов управления заданиями.

Как особый случай, если плагин политики не определяет близкую функцию и никакое имущество, требуется, sudo выполнит команду непосредственно вместо того, чтобы назвать ветвление (2) сначала. sudoers плагин политики только определит близкую функцию, когда вход ввода-вывода будет включен, имущество требуется, или pam_session или pam_setcred опции включены. Обратите внимание, что pam_session и pam_setcred включены по умолчанию в системах с помощью PAM.

10
ответ дан 23 November 2019 в 07:19

Это происходит при запуске любого процесса с sudo, Один процесс sudo, программа и другой являются программой, запущенной с sudo, который является дочерним процессом первого. sudo программа выйдет только, когда процесс она будет работать за (его ребенок) выходы. Вот извлечение из моего pstree при выполнении sudo apt update

    ├─mate-terminal─┬
                    ├─bash───sudo───apt
               child of bash--^      ^--child of sudo
6
ответ дан 23 November 2019 в 07:19

Другие вопросы по тегам:

Похожие вопросы: