我在终端中运行一个无法退出的程序Ctrl-C我想终止它。我怎样才能找到它的 PID?
答案1
打开另一个终端并运行,ps ax | grep foo
其中 foo 是无响应程序的名称。这将返回一行如下所示的输出:
$ ps ax | grep firefox
2222 ? S 0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ? Sl 514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2 S+ 0:00 grep --color=auto firefox
每行输出的第一个字段是一个数字,代表所匹配程序的进程 ID grep
(您可以放心地忽略最后一个字段,它代表grep
它自己)。
要停止有问题的进程,请执行以下操作:
kill pid
其中 pid 是程序的进程 ID。您可能需要自行判断需要编辑哪个匹配项kill
,或者可以使用top
。kill
单独使用会发送 SIGTERM,您应该首先尝试它,因为它允许程序在运行后正确清理自身。如果 SIGTERM 失败,请尝试 SIGHUP,它是更强的良药:kill -HUP pid
。如果所有方法都失败,请发送 SIGKILL。但是,您应该只在万不得已的情况下才这样做,因为 SIGKILL 会导致内核立即终止进程,而无法清理。有时这会导致数据损坏或其他问题。因此,再次强调,只在万不得已的情况下发送 SIGKILL。要这样做,请执行kill -KILL pid
或kill -9 pid
。
当然,如果您运行的是图形界面,您就不必费心处理这些疯狂的命令行。只需打开“系统监视器”,导航到“进程”选项卡,选择要停止的进程(嗯,可能是占用 90% CPU 的进程?),然后右键单击它。由于该进程已停止(这就是问题所在,对吧?),请从出现的菜单中选择“结束进程”或“终止进程”。
归功于公案头
答案2
当您可以使用 pgrep、pkill、pidof 等完成相同的命令时,我认为没有必要使用这么长的命令……
要获取正在运行的程序的 PID,您可以使用以下pgrep
命令pidof
:
程序包
pgrep [options] pattern
pgrep
查看当前正在运行的进程,并将符合选择条件的进程 ID 列到标准输出。所有条件都必须匹配。例如,
查找 root 拥有的名为 sshd 的进程。
$ pgrep -u root sshd
列出 root 或守护进程拥有的进程。
$ pgrep -u root,守护进程
列出搜索完整命令行的进程(
-f
)并列出完整命令行以及进程 ID(-a
)。$ pgrep -fa needle
皮多夫
pidof
查找指定程序的进程 ID (pid)。它将这些 ID 打印到标准输出上。
pidof 程序名
要通过 pid 终止程序,请使用pkill
。例如:
pkill pid
pkill -f process_name
pkill -o process_name
pkill -n process_name
pkill -l process_name
-f
标志:搜索进程名称(参见 man pkill)-o
标志:仅选择最旧的匹配进程。-n
标志:仅选择最新的匹配进程。-l
flag:列出进程名称以及进程ID。
答案3
了解正在运行的程序的 pid 的最简单方法是使用:
pidof <application name>
例如,如果你启动了 vim 并且想知道它的 pid:
pidof vim
请记住,您需要提供已启动的确切程序名称。
例如,如果您正在运行 vi 并执行,pidof vim
则将无法获得正确的结果。
请参阅的pidof
手册页以了解更多信息。
答案4
如果您只想要 pid(对于自动终止脚本等有用...)
pgrep -f desired_program_name