[英]How to get the current Linux process ID from the command line a in shell-agnostic, language-agnostic way
如何以与shell无关,语言无关的方式从Linux命令行获取当前进程ID(pid)?
pidof(8)
似乎没有选择让调用进程' pid
。 Bash当然有$$
- 但是对于我的通用用法,我不能依赖shell(Bash或其他)。 在某些情况下,我无法编写脚本或可编译程序,因此Bash / Python / C / C ++(等)将无法正常工作。
这是一个特定的用例:我想获得正在运行的基于Python-Fabric的远程SSH进程的pid
(人们可能希望避免假设bash正在运行),以便除其他外我可以复制和/或创建具有唯一文件名的文件和/或目录(如mkdir /tmp/mydir.$$
)。
如果我们可以解决特定于Fabric的问题,这会有所帮助 - 但它并不能解决我的长期问题。 对于所有未来场景中的通用用法,我只想要一个返回$$
在Bash中传递的命令。
从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执行脚本而不是交互式脚本,这也不会在脚本中工作。
伟大的答案+评论在这里和这里 。 大家好。 将两者结合到一个答案中,提供两个选项,在POSIX-shell-required与no-POSIX-shell-required上下文之间进行权衡:
$$
cut -d ' ' -f 4 /proc/self/stat
此处显示了两种方法(以及其他提议的非工作方法)的示例会话。
(不确定如何关注shell独立是多么相关/有用,但只是经历了很多次“无shell运行系统调用”约束,现在只要有可能就会寻求与shell无关的选项。)
更少的角色并保证工作:
sh -c 'echo $PPID'
如果您可以访问proc文件系统,那么/ proc / self是当前/ proc / $ pid的符号链接。 你可以从例如/ proc / self / stat的第一列读出pid。
如果你在python中,你可以使用os.getpid()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.