如果一个procces像这样运行是什么意思?

时间:2016-05-27 14:46:39

标签: linux

您好我对某个流程有疑问。这是我在运行这条线时得到的结果:

ls -l /proc/3502/exe

enter image description here

如果我执行此行:

echo "$(xargs -0 < /proc/${pids[0]}/cmdline)"

我得到一个输出:/ bin / bash ./sleeper.sh 10

这是否意味着实际运行的procces是/ bin / bash,之后的所有内容仅作为参数传递给它(Procces:/ bin / bash args它得到:./ skipper.sh 10)??因为我知道最后一部分是脚本的名称和传递给它的参数。

1 个答案:

答案 0 :(得分:2)

  

这是否意味着实际运行的procces是/ bin / bash,之后的所有内容仅作为参数传递给它(Procces:/ bin / bash args它得到:./ skipper.sh 10)??

情况确实如此。当您运行如下脚本:./script时,程序加载器会解析脚本,查找将告诉它如何运行该脚本的shebang。需要Shebang来区分,例如,来自Bash脚本的Python脚本,或来自Perl脚本。这些脚本实际上由各自的口译员执行,这些口译员通常是/bin/python/bin/bash/bin/perl,这就是为什么你看到它列为/bin/bash ./sleeper 10而不是./sleeper.sh 10

例如,假设./script如下所示:

#!/bin/sh
echo yo

使用./script运行它会导致系统产生/bin/sh ./script。 (轶事:由于它是如何工作的,一些shebangs还包括它自己的命令行参数,如#!/usr/bin/perl -T,这将导致系统将您的脚本生成为/usr/bin/perl -T x)。

至于为什么脚本看到./sleeper.sh 10而不是/bin/bash ./sleeper.sh 10 - 它只是Bash(和其他解释器)的工作方式。每个人都可以看到shebang扩展,包括Bash。因此ps ux将显示/bin/bash ./sleeper.sh 10。但是,对于你的脚本来说,知道Bash标志和它被调用的Bash路径的确切特定组合是没有意义的,所以Bash剥离它们并仅传递相关的命令行。 Bash尝试使该命令行与常规命令行规则一致,这意味着脚本的第一个参数通常是脚本的路径(caveats),其余参数是传递给脚本的参数

看到所有这一切

./test

#!/bin/bash -i
echo $BASH_ARGV
  • ./test运行它不会打印任何内容。该过程产生为/bin/bash -i ./test
  • ./test x y格式运行x y。该过程产生为/bin/bash -i ./test x y

<强>建议

广泛建议您忽略可执行文件中的.sh.py.pl等扩展名。