Python 如何以与shell无关、与语言无关的方式从命令行获取当前Linux进程ID
如何以与shell无关、与语言无关的方式从Linux命令行获取当前进程ID(pid) 似乎没有获取调用进程“Python 如何以与shell无关、与语言无关的方式从命令行获取当前Linux进程ID,python,linux,shell,command-line,fabric,Python,Linux,Shell,Command Line,Fabric,如何以与shell无关、与语言无关的方式从Linux命令行获取当前进程ID(pid) 似乎没有获取调用进程“pid的选项。当然,Bash有$$——但是对于我的一般用法,我不能依赖shell(Bash或其他)。在某些情况下,我不能编写脚本或可编译程序,所以BASH/Python/C/C++(等)将无法工作。 这里有一个特定的用例:我想获得运行中的、基于的远程SSH进程的pid(人们可能希望避免假设bash正在运行),这样我就可以复制和/或创建具有唯一文件名的文件和/或目录(如mkdir/tmp/m
pid
的选项。当然,Bash有$$
——但是对于我的一般用法,我不能依赖shell(Bash或其他)。在某些情况下,我不能编写脚本或可编译程序,所以BASH/Python/C/C++(等)将无法工作。
这里有一个特定的用例:我想获得运行中的、基于的远程SSH进程的pid
(人们可能希望避免假设bash正在运行),这样我就可以复制和/或创建具有唯一文件名的文件和/或目录(如mkdir/tmp/mydir.$$
)
如果我们能够解决特定于织物的问题,这是很有帮助的,但它不能解决我的长期问题。对于将来所有场景中的通用用法,我只需要一个命令,该命令返回Bash中提供的内容。如果您可以访问proc文件系统,那么/proc/self是当前/proc/$pid的符号链接。例如,您可以从/proc/self/stat的第一列读取pid
如果您使用的是python,则可以使用os.getpid()。希望这是一个可移植的工具,它依赖于PPID作为
/proc/[pid]/stat的第四个字段:
cut -d ' ' -f 4 /proc/self/stat
它假设Linux具有正确的/proc
形状,/proc/[pid]/stat
的布局与Debian 6.0.1的布局没有不兼容的区别,cut
是一个单独的可执行文件,而不是shell内置文件,而且cut不会产生子进程
作为替代,您可以获取字段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行为的依赖——只有当会话id是您真正想要的PID时,它才必须设置会话id。显然,如果您希望shell的PID执行脚本,而不是交互式脚本,那么这在脚本中也不起作用。$$
不是bash特有的--我相信它在所有兼容POSIX的shell中都可用,这相当于几乎每一个外壳都不是故意的怪异。非常好的答案+评论和评论。谢谢。将两者结合为一个答案,提供两个选项,在需要POSIX shell与不需要POSIX shell的上下文中进行权衡:
POSIX外壳可用:使用
通用命令行:雇用
显示了两种方法(以及其他建议的非工作方法)的示例会话
(不确定如此关注独立于shell有多重要/有用,但只是经历了多次“在不使用shell的情况下运行系统调用”约束,现在只要有可能,就会寻找独立于shell的选项。)来自python:
$ python
>>> import os
>>> os.getpid()
12252
更少的字符并保证工作:
sh -c 'echo $PPID'
谢谢。。。但不能依赖任何外壳。。。任何可以运行SSH服务器的系统都可能有一个兼容POSIX的shell。任何奇怪到没有备份的系统都可能缺少您选择的任何备份,以及您隐含依赖的其他东西(如/tmp
或mkdir
)。@Dashwuff POSIX compliant将排除csh
及其同类。我理解它的问题的方式是,客户端进程将代表SSH会话中运行的某个用户定义脚本执行一些命令,对这些脚本的唯一限制是它们必须位于某种Unix shell中。在Python结构中,“需要一些POSIX shell”依赖可能是有效的。在其他一些情况下,可能无法依赖任何shell(例如,在一些Python系统调用中……但是Python有自己的api来确定pid)。唉,如果我必须依赖一个外壳,我必须依赖一个外壳。但是天哪,像“pidof--self”这样的东西会比cd/proc/self好得多;切割-F1-d''状态;cd-
(根据我对上面主要问题的评论),它还没有在其他Linux系统上进行可移植性测试(除了我的Ubuntu 11.04);我的观点很简单,echo$
可能与这里介绍的其他替代方案一样可移植,如果不是更多的话。(例如,任何使用/proc
的东西都只能在Linux上工作;$$
,另一方面,甚至可以在Windows上工作。)cd/proc/self;切割-F1-d''状态;cd-
是迄今为止唯一在Ubuntu服务器11.04上运行的东西。其他基于/proc
的解决方案均未奏效;它们要么生成一个不是当前运行的进程pid的pid,要么不提供任何数字。看起来越来越像是一个依赖于壳的东西。可行,但并非在所有情况下都是最优的。最终,从长远来看,thinkpidof
应该使用类似于pidof--self
的功能进行更新;切割-F1-d''状态;cd-does:@johnyutahh Hm,对,此时/proc/self将指向readlink
的pid。幸运的是,该文件还包含ppid,我将把我的答案修改为一个命令解决方案。好的,新的风格(cut-d'-f4/proc/self/stat
)确实有效,cmd比我的更好(nocd
)。例如,会话。你知道这在许多linux发行版和更老版本(linux/内核)中的可移植性有多高吗?@JohnnyUtahh提到,stat
中的一个字段存在于“自linux 2.1.22以来”,这是一个古老的版本。我将其解释为,没有这样注释的字段以前就存在过。之后列出的stat
字段的版本号也在增加,这意味着新的f