Убить процесс из приложения Linux - PullRequest
3 голосов
/ 19 июля 2011

Какой самый лучший и самый эффективный способ найти pid конкретной задачи.Скажите:

ps -ef | grep "\/usr\/sbin\/watchdog" | cut -d" " -f2

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

system("kill -9 `ps -ef | grep "\/usr\/sbin\/watchdog" | cut -d" " -f2`);

Есть ли более оптимизированный способ сделать то же самое.

Ответы [ 6 ]

3 голосов
/ 19 июля 2011

вы можете использовать pidof

kill -9 `pidof <your application name>`

имя вашего приложения может быть / usr / sbin / watchdog

2 голосов
/ 20 июля 2011

Может быть, это идеальное мировое решение ...

Чтобы получить сторожевой PID, вам нужно всего лишь открыть файл '/var/run/watchdog.pid'.

Как только вы узнаете PID процессалучший способ уничтожить процесс - это не вызвать функцию 'system', а вызвать функцию 'kill' API UNIX:

#include <sys/types.h>
#include <signal.h>

int
kill(pid_t pid, int sig);

Это позволяет избежать появления новых процессов.

Если файл '/var/run/watchdog.pid' не существует, вы можете вернуться к system / kill / pidof.

1 голос
/ 19 июля 2011

Взгляните на: http://linux.die.net/man/5/proc

Вы можете выполнить поиск в /proc файловой системе и найти ссылку /proc/$(PIC)/exe, которая указывает на /usr/sbin/watchdog

Как только вы получите pid, просто kill (см. Man 2 kill)

1 голос
/ 19 июля 2011

Вам нужно перебрать подкаталоги в /proc, чтобы найти процессы, которые вы хотите убить Тогда используйте kill(2).

1 голос
/ 19 июля 2011

Чтобы отобразить все процессы, принадлежащие текущему пользователю, введите ps ux и нажмите return:

$ ps ux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jhaas 3064 0.1 3.6 18324 9088 ? S 17:55 0:00 /usr/bin/gnome-session
jhaas 3107 0.0 0.3 3128 968 ? S 17:55 0:00 /usr/bin/ssh-agent /etc/X11/xinit/Xclients
....

Теперь, если вы хотите прекратить, например, процесс emacs, вы должны найти идентификатор процесса (PID) в приведенной выше таблице (3216) и сказать:

$ kill -9 3216

Источник: http://linux.about.com/library/cmd/blcmdl_kill.htm

0 голосов
/ 20 июля 2011

pgrep на самом деле вполне подходит для этого, особенно если вы когда-нибудь намереваетесь использовать регулярное выражение для сопоставления с именами процессов.Он является частью пакета procps, который уже должен быть установлен в любой системе Linux (ps находится в том же пакете).Вот пример использования:

psychotic@bismuth ~ $ pgrep 'fire.*'
2902
2903
2904
6979
psychotic@bismuth ~ $ pgrep -l 'fire.*'
2902 firegl
2903 firegl
2904 firegl
6979 firefox-bin
...