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

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

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

似乎没有获取调用进程“
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,要么不提供任何数字。看起来越来越像是一个依赖于壳的东西。可行,但并非在所有情况下都是最优的。最终,从长远来看,think
    pidof
    应该使用类似于
    pidof--self
    的功能进行更新;切割-F1-d''状态;cd-does:@johnyutahh Hm,对,此时/proc/self将指向
    readlink
    的pid。幸运的是,该文件还包含ppid,我将把我的答案修改为一个命令解决方案。好的,新的风格(
    cut-d'-f4/proc/self/stat
    )确实有效,cmd比我的更好(no
    cd
    )。例如,会话。你知道这在许多linux发行版和更老版本(linux/内核)中的可移植性有多高吗?@JohnnyUtahh提到,
    stat
    中的一个字段存在于“自linux 2.1.22以来”,这是一个古老的版本。我将其解释为,没有这样注释的字段以前就存在过。之后列出的
    stat
    字段的版本号也在增加,这意味着新的f