从Linux应用程序中终止一个进程

3

如何最好、最有效地查找特定任务的pid,例如:

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

有没有更有效的方法来找到相同的进程。我想从我的应用程序中杀死看门狗进程。我考虑使用系统命令来完成。

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

有没有更优化的方法做同样的事情。

1
你应该只在万不得已的情况下使用-9,而不是例行公事。 - Keith
6个回答

3
您可以使用pidof命令。
kill -9 `pidof <your application name>`

您的应用程序名称可能是 /usr/sbin/watchdog


2

也许这是一个理想的解决方案...

要获取看门狗进程的PID,只需要打开文件'/var/run/watchdog.pid'

一旦你知道了进程的PID,最好的终止进程的方法不是调用'system'函数,而是调用UNIX API的'kill'函数:

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

int
kill(pid_t pid, int sig);

这可以避免产生新的进程。
如果文件'/var/run/watchdog.pid'不存在,您可以退回到系统/kill/pidof。

1

要显示当前用户拥有的所有进程,请键入ps ux并按回车:

$ 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


1
这里有一个 c 标签,意味着这应该是一个 C 语言的解决方案。 - Delan Azabani

1
你应该迭代 /proc 中的子目录,找到你想要终止的进程。然后使用 kill(2)

1

请查看:http://linux.die.net/man/5/proc

您可以搜索/proc文件系统并找到一个指向/usr/sbin/watchdog的链接/proc/$(PIC)/exe

一旦获取PID,只需kill它(参见man 2 kill)


proc文件系统列出了进程ID,我如何从中找到特定应用程序(比如看门狗)的进程ID。 - Karun
@Karun:使用pidof命令,你可以查看我的答案。 - TheOneTeam
@Karun:对于每个进程,都有一个以PID命名的目录。在这个目录中,你会找到你要查找的信息(如链接的手册中所述)。 - Oben Sonne

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接