如何找到正在运行的终端程序的进程 ID (PID)?

如何找到正在运行的终端程序的进程 ID (PID)?

我在终端中运行一个无法退出的程序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,或者可以使用topkill单独使用会发送 SIGTERM,您应该首先尝试它,因为它允许程序在运行后正确清理自身。如果 SIGTERM 失败,请尝试 SIGHUP,它是更强的良药:kill -HUP pid。如果所有方法都失败,请发送 SIGKILL。但是,您应该只在万不得已的情况下才这样做,因为 SIGKILL 会导致内核立即终止进程,而无法清理。有时这会导致数据损坏或其他问题。因此,再次强调,只在万不得已的情况下发送 SIGKILL。要这样做,请执行kill -KILL pidkill -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标志:仅选择最新的匹配进程。
  • -lflag:列出进程名称以及进程ID。

答案3

了解正在运行的程序的 pid 的最简单方法是使用:

pidof <application name>

例如,如果你启动了 vim 并且想知道它的 pid:

pidof vim

请记住,您需要提供已启动的确切程序名称。

例如,如果您正在运行 vi 并执行,pidof vim则将无法获得正确的结果。

请参阅的pidof手册页以了解更多信息。

答案4

如果您只想要 pid(对于自动终止脚本等有用...)

pgrep -f desired_program_name

相关内容