Что действительно 'уничтожает-0', делают?

'Общий' подход был бы

$ sudo update-rc.d -f servicename remove

удалить servicename из любого runlevel для запуска автоматически.

Чтобы повторно включить значения по умолчанию, сделать

$ sudo update-rc.d servicename defaults
66
10.07.2018, 10:55
2 ответа

Это немного трудно понять, но если вы посмотрите на следующие 2 man-страницы, вы увидите следующие примечания:

kill(1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
kill(2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; 
this can be used to check for the existence of a process ID or process 
group ID.
...

Так что сигнал 0 на самом деле не будет посылать ничего на PID вашего процесса, а будет проверять, есть ли у вас на это разрешение.

Где это может быть полезно?

Одно из очевидных мест было бы, если бы вы пытались определить, имеете ли вы разрешения посылать сигналы запущенному процессу через kill. Вы могли бы проверить перед отправкой действительного сигнала kill, который вам нужен, обернув проверку, чтобы убедиться, что kill -0 сначала было разрешено.

Пример

Скажем, что процесс запускался root следующим образом:

$ sudo sleep 2500 &
[1] 15693

Теперь в другом окне, если мы запустим эту команду, мы сможем подтвердить, что PID запущен.

$ pgrep sleep
15693

Теперь попробуем эту команду, чтобы проверить, имеем ли мы доступ к отправке этих PID-сигналов через kill.

$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!

Итак, это работает, но на выходе утечка сообщения из команды kill о том, что у нас нет разрешений. Ничего страшного, просто поймайте STDERR и отправьте его на /dev/null.

$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!

Полный пример

Так что тогда мы могли бы сделать что-то вроде этого, убийцы. bash:

#!/bin/bash

PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then 
  echo "you don't have permissions to kill PID:$PID"
  exit 1
fi

kill -9 $PID

Теперь, когда я запускаю вышеперечисленное от имени пользователя без root:

$ ~/killer.bash 
you don't have permissions to kill PID:15693

$ echo $?
1

Однако, когда он запускается от имени root:

$ sudo ~/killer.bash 

$ echo $?
0

$ pgrep sleep
$
84
27.01.2020, 19:31

kill -0 (или его более переносимый вариант POSIX kill -s 0 ) проходит процедуру отправки сигнала, но на самом деле не отправляет его. Это особенность базового API C , которую команда оболочки предоставляет простым способом.

kill -s 0 - "$ pid" , таким образом, проверяет, существует ли запущенный процесс с данным PID (или PGID, если $ pid отрицательный), и будет ли текущий процесс иметь разрешение на отправку ему (любому из процессов в группе процессов в случае отрицательного $ pid ) сигнала. В основном это способ проверить, жив ли процесс (или группа процессов).

Имейте в виду, что даже если есть запущенный процесс с ожидаемым PID и разрешениями, это не обязательно тот процесс, которого вы ожидаете. Возможно, ожидаемый процесс умер раньше, и его PID был повторно использован для несвязанного процесса. Правильный способ контролировать процессы - позволить сделать это их родителю - PID процесса не используется повторно, пока его родитель не признает его смерть (поэтому существуют зомби ), поэтому родительский процесс может надежно идентифицировать своих потомков по их PID.

23
27.01.2020, 19:31

Теги

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