'Общий' подход был бы
$ sudo update-rc.d -f servicename remove
удалить servicename из любого runlevel для запуска автоматически.
Чтобы повторно включить значения по умолчанию, сделать
$ sudo update-rc.d servicename defaults
Это немного трудно понять, но если вы посмотрите на следующие 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
$
kill -0
(или его более переносимый вариант POSIX kill -s 0
) проходит процедуру отправки сигнала, но на самом деле не отправляет его. Это особенность базового API C , которую команда оболочки предоставляет простым способом.
kill -s 0 - "$ pid"
, таким образом, проверяет, существует ли запущенный процесс с данным PID (или PGID, если $ pid
отрицательный), и будет ли текущий процесс иметь разрешение на отправку ему (любому из процессов в группе процессов в случае отрицательного $ pid
) сигнала. В основном это способ проверить, жив ли процесс (или группа процессов).
Имейте в виду, что даже если есть запущенный процесс с ожидаемым PID и разрешениями, это не обязательно тот процесс, которого вы ожидаете. Возможно, ожидаемый процесс умер раньше, и его PID был повторно использован для несвязанного процесса. Правильный способ контролировать процессы - позволить сделать это их родителю - PID процесса не используется повторно, пока его родитель не признает его смерть (поэтому существуют зомби ), поэтому родительский процесс может надежно идентифицировать своих потомков по их PID.