如何从命令行获取当前的Linux进程ID a与shell无关,与语言无关

如何从shell命令行获得当前的进程ID(pid),这是与shell无关的,与语言无关的方式?

pidof(8)似乎没有选项来获得调用进程的pid 。 Bash当然有$$ – 但是对于我的通用用法,我不能依赖一个shell(Bash或其他)。 在某些情况下,我不能编写脚本或可编译的程序,所以Bash / Python / C / C ++(等等)将不起作用。

下面是一个具体的用例:我想获得正在运行的,基于Python-Fabric的远程SSH进程(可以避免假设bash正在运行)的pid ,这样我就可以复制和/或创build文件和/或具有唯一文件名的目录(如在mkdir /tmp/mydir.$$ )。

如果我们可以解决面料特定的问题,这是有帮助的,但它不能解决我的长期问题。 对于所有未来场景中的通用用途,我只想要一个返回$$在Bash中提供的命令。

Solutions Collecting From Web of "如何从命令行获取当前的Linux进程ID a与shell无关,与语言无关"

从python:

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

$$不是特定于bash的 – 我相信它在所有兼容POSIX的shell中都是可用的,这几乎相当于每个不会故意奇怪的shell。

希望这是足够便携的,它依赖于PPID是/proc/[pid]/stat的第四个字段:

 cut -d ' ' -f 4 /proc/self/stat 

它假设一个具有正确形状的/proc的Linux, /proc/[pid]/stat的布局不会与Debian 6.0.1的版本不兼容,这个cut是一个单独的可执行文件,而不是shell内建的,而这个切割不会产生子进程。

作为一种替代方法,您可以获得字段6而不是字段4以获取“会话负责人”的PID。 交互式shell显然将自己设置为会话领导,并且这个id在管道和子shell调用中应该保持不变:

 $ echo $(echo $( cut -f 6 -d ' ' /proc/self/stat ) ) 23755 $ echo $(echo $( cut -f 4 -d ' ' /proc/self/stat ) ) 24027 $ echo $$ 23755 

也就是说,这引入了对正在运行的shell的行为的依赖 – 只有当它实际上是你想要的PID的时候,它才能设置会话id。 显然,如果你想要执行脚本的shell的PID,而不是交互的脚本,这也不能在脚本中工作。

很好的答案+评论在这里和这里 。 Thx全部。 将两者结合成一个答案,在POSIX-shell-required和no-POSIX-shell所需的上下文中提供两个折中选项:

  1. POSIX shell可用:使用$$
  2. 一般的cmdline:雇佣cut -d ' ' -f 4 /proc/self/stat

这里显示了两种方法(以及其他提议的非工作方法)的示例会话。

(不确定是多么相关/有用,它是如此关心独立于shell,但只是经历了许多次“运行没有shell的系统调用”约束,现在寻求与shell无关的选项)。

如果您有权访问proc文件系统,那么/ proc / self是当前/ proc / $ pid的符号链接。 你可以读取pid,例如/ proc / self / stat的第一列。

如果你在Python中,你可以使用os.getpid()。

更少的字符,并保证工作:

 sh -c 'echo $PPID'