如何在Bash中查找正在运行的命令的PID?

4

我曾经在谷歌上搜索过这个问题,但从未找到与我的情况相关的有用信息。

所以,我想弄清楚的是某个正在运行的命令的PID,以便如果需要,可以将其终止。我知道可以通过输入 echo $! 来获取一个命令的PID。因此,假设

my_command & echo $!

应该返回进程PID,但实际情况并非如此,我认为我知道原因:

我的命令如下:

screen -d -m -S Radio /path/to/folder -f frequency -r path/to/song

这种方法会首先打开一个独立的 screen,然后输入命令以便在后台执行。因此,echo 显示给我的PID是错误的。我猜它显示了 screen -d -m -S Radio /path/to/folder -f frequency -r path/to/song 的PID,而不是在 screen 创建的新终端中运行的命令的PID。

但这还有另一个问题:当我在终端中运行 screen -ls 命令时,后台正在运行的命令不会显示出来!我相当确定它正在运行,因为树莓派的CPU使用率一直保持在25%(通常为0%或1%),而且当我键入 ps au 时,实际上可以看到该命令和PID。

所以现在我向社区求助:您是否有任何想法可以找到新终端中某个命令的PID?我正在编写一个bash脚本,因此必须通过代码获取PID。最好的方法是使用一个命令将PID存储在变量中!


SO是用于编程问题的,而不是关于使用或配置Linux的问题。SuperUser.com或unix.stackexchange.com更适合此类问题。 - Barmar
1
如果输出是给人看的,请添加-l标志:pgrep -f search_pattern - glenn jackman
谢谢@glennjackman,你的评论对我有用。不知何故,我现在有了命令的PID! - Zebiano
2个回答

5
感谢@glennjackman的帮助,我用一个简单的pgrep search_word找到了我想要的PID。起初它不能正常工作,但在一番试验后我设法让它正常工作了。想获得PID变量的人,只需输入pid=$(pgrep search_word)
关于screen -ls不显示我的分离会话的问题,它还没有解决,但我不介意。再次感谢@glennjackman解决了我的问题!
编辑:
第二个问题已经解决,请查看berends答案中的评论。

2

您可以通过编写以下命令轻松找到所有正在运行的进程及其PID:

ps aux

该过程是由screen运行的,所以您可以通过编写以下内容来更轻松地找到它:
ps aux | grep screen

想要了解更多关于ps命令和我使用的参数的信息,请查看(快速谷歌)-> https://www.lifewire.com/g00/uses-of-linux-ps-command-4058715?i10c

编辑:您也可以在bash脚本中使用此命令。


谢谢。grep 工具在某种程度上帮了我,但正如我所说:我需要它在脚本中运行。我知道如何在终端上自己找到它,但我需要我的脚本知道它的 PID,并且在脚本中写入 ps aux | grep screen 并没有什么帮助...此外,在我的情况下,该命令始终会产生至少两个结果。 - Zebiano
好的,让我们退一步,如果它正在屏幕上运行 - 您应该能够通过 screen -ls 命令看到它。您是否以拥有屏幕会话的用户身份运行 screen -ls 命令? - berend
你手动启动了屏幕吗?我建议先尝试解决这个问题,因为除了它被其他用户运行或根本没有运行之外,我想不到任何其他原因导致你无法通过screen -ls看到它。检查一下/var/run/screen里面的内容,你应该能够找到每个用户下的所有屏幕。 - berend
1
在脚本中使用 ps 并不是一个好的方式,因为有更好的替代方法可用。这种方式极易出错;例如 grep foo 可能会找到正在运行 vim foo.conf 的人。BashFAQ#33讨论了替代方案(特别是如果上下文是任何类型的守护进程管理时应该如何使用这些进程;ProcessManagement也相关)。 - Charles Duffy
@berend,我弄清楚为什么“screen -ls”没有显示我的分离会话了。我在程序开始时运行了一次屏幕,并在这个新的屏幕会话中启动了另一个screen会话。由于它是“一个屏幕里面的另一个屏幕”,其中一个屏幕(最内部的那个)不会显示出来。 - Zebiano
显示剩余2条评论

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