如何以与shell和语言无关的方式从命令行获取当前Linux进程ID

27 投票
6 回答
48648 浏览
提问于 2025-04-17 07:07

如何在Linux命令行中以一种不依赖于特定外壳或编程语言的方式获取当前进程的ID(pid)呢?

pidof(8)似乎没有选项可以获取调用进程的pid。当然,Bash中可以使用$$来获取当前进程ID,但我想要的用法比较通用,不能依赖于某个特定的外壳(比如Bash)。而且在某些情况下,我不能写脚本或可编译的程序,所以Bash、Python、C、C++等都不适用。

这里有一个具体的使用场景:我想获取正在运行的基于Python-Fabric的远程SSH进程的pid(在这种情况下,我希望避免假设Bash正在运行),这样我就可以复制和/或创建具有唯一文件名的文件和/或目录(比如mkdir /tmp/mydir.$$)。

如果我们能解决Fabric特定的问题,那当然很好,但这并不能解决我长期以来的问题。对于未来所有场景的通用使用,我只想要一个命令,能够返回Bash中$$所提供的内容。

6 个回答

9

$$ 这个东西并不是只有 bash 才有的——我觉得在所有符合 POSIX 标准的命令行环境中都能用,也就是说,几乎所有正常的命令行工具都可以使用这个功能,除非它们故意设计得很奇怪。

67

来自Python:

$ python
>>> import os
>>> os.getpid()
12252
2

这里有很棒的答案和评论,大家可以看看这里这里。谢谢大家!我把这两个答案结合成一个,提供了两种选择,分别适用于需要POSIX shell和不需要POSIX shell的情况:

  1. 如果有POSIX shell可用:可以使用$$
  2. 如果是一般命令行:可以使用cut -d ' ' -f 4 /proc/self/stat

这两种方法的示例会话(还有其他一些提议但不工作的方式)可以在这里查看。

(我不太确定为什么这么关注与shell无关的选项,但我经历过很多次“在没有shell的情况下运行系统调用”的限制,所以现在尽量寻找不依赖shell的选项。)

撰写回答