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

Joh*_*ahh 27 python linux shell command-line fabric

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

pidof(8)似乎没有选择来获得调用过程' pid.当然,Bash有$$- 但是对于我的通用用法,我不能依赖shell(Bash或其他).在某些情况下,我无法编写脚本或可编译程序,因此Bash/Python/C/C++(等)将无法正常工作.

这是一个特定的用例:我想获得pid运行的,基于Python-Fabric的远程SSH进程(人们可能希望避免假设bash正在运行),以便除其他外我可以复制和/或创建文件和/或具有唯一文件名的目录(如mkdir /tmp/mydir.$$).

如果我们可以解决特定于Fabric的问题,这会有所帮助 - 但它并不能解决我的长期问题.对于所有未来场景中的通用用法,我只想要一个返回$$Bash中传递内容的命令.

Ale*_*huk 66

从python:

$ python
>>> import os
>>> os.getpid()
12252
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这不能回答上面的问题,但它确实回答了我来到这里的问题(: (10认同)
  • 这给了python shell的PID!请改用:`python3 -c"import os; print(os.getppid())"` (8认同)

dus*_*uff 8

$$ 不是特定于bash的 - 我相信它可以在所有符合POSIX标准的shell中使用,这相当于每个shell都不是故意的怪异.


mil*_*ose 7

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

cut -d ' ' -f 4 /proc/self/stat
Run Code Online (Sandbox Code Playgroud)

它假定Linux的形状正确/proc,布局/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 
Run Code Online (Sandbox Code Playgroud)

也就是说,这会引入对正在运行的shell的行为的依赖 - 它必须仅在它实际需要PID时才设置会话ID.显然,如果你想要shell的PID执行脚本而不是交互式脚本,这也不会在脚本中工作.


Joh*_*ahh 2

这里这里都有很好的答案+评论。谢谢大家。将两者合并为一个答案,提供两种选项,并在需要 POSIX-shell 和不需要 POSIX-shell 的上下文中进行权衡:

  1. POSIX shell 可用:使用$$
  2. 通用命令行:雇佣cut -d ' ' -f 4 /proc/self/stat

此处显示了使用这两种方法(以及其他建议的非工作方法)的示例会话。

(不知道如此关​​心与 shell 无关有多么相关/有用,但只是经历过多次“在没有 shell 的情况下运行系统调用”约束,现在只要有可能就会寻求与 shell 无关的选项。)