Contents

如何将命令行参数传递给Unix/Linux系统上的运行进程?

1. 简介

我们经常需要弄清楚我们传递给正在运行的进程的命令行参数。然后我们可以将它们用于调试或故障排除目的。 在本教程中,我们将介绍几种实现此目的的方法。我们将在下面使用的所有方法都要求我们知道进程的 PID。因此,我们将简要介绍如何计算进程的 PID。

2.查找进程的PID

我们可以使用ps 命令来获取很多关于正在运行的进程的有用信息。要查找我们进程的 PID,我们可以使用 ps命令列出所有进程,然后使用grep 搜索我们的进程的输出:

$ ps -ef | grep mongo
mongodb      811       1  0 06:11 ?        00:00:36 /usr/bin/mongod --config /etc/mongod.conf

通过这个输出,我们看到 811 是我们正在寻找的进程的 PID。我们也可以使用 pgrep 命令一步完成:

$ pgrep -l -f mongod
811 mongod

3. 使用 ps命令获取使用 PID的参数

知道 PID 后,我们可以使用ps命令获取有关进程的详细输出

$ ps -fp 1366
UID          PID    PPID  C STIME TTY          TIME CMD
kd          1366       1  4 06:12 ?        00:05:08 /opt/google/chrome/chrome --enable-crashpad
$ ps -fp 90960
UID          PID    PPID  C STIME TTY          TIME CMD
kd         90960    1535  0 07:10 ?        00:00:07 /opt/google/chrome/chrome --type=renderer --enable-crashpad -

虽然上面的命令对于短命令工作得很好,但我们看到该行被截断了较长的命令,如后一种情况所示。为了防止这种情况,**我们可以将 -ww选项传递给ps,以获得宽输出,**如下所示:

$ ps -ww -fp 23441
UID          PID    PPID  C STIME TTY          TIME CMD
kd         23441    1535  0 06:26 ?        00:00:00 /opt/google/chrome/chrome --type=renderer --enable-crashpad --crashpad-handler-pid=1485 ...

ps命令还提供了一个 **选项 -o使我们能够指定输出格式。**所以,如果我们只需要参数,我们可以去掉表中所有其他不必要的列,让命令只打印我们需要的内容:

$ ps -o args= -ww -fp 23441
/opt/google/chrome/chrome --type=renderer --enable-crashpad --crashpad-handler-pid=1485 --enable-crash-reporter=e8242aea-a1ad-40f1-9787-b33d85f30b99 ...

我们可以通过从一开始删除命令来轻松地使用此输出进行进一步处理,这将只留下参数列表。

4. 读取*/proc/pid/cmdline*

对于我们系统上运行的每个进程,Linux 在 */proc/*目录下创建一个目录。对于 pid为1366 的进程,目录将为 /proc/1366。该目录包含各种文件,可以提供有关特定进程的信息。我们必须注意,  /proc目录实际上并不存在于磁盘上,而是由操作系统创建为内存中的文件系统,用于实用目的。

要获取我们传递给进程的参数,我们可以读取 进程文件夹下的cmdline文件,如下所示:

$ cat /proc/1366/cmdline
/opt/google/chrome/chrome --enable-crashpad

根据我们使用的终端应用程序,我们可能会得到格式错误的输出,因为系统会将命令中的空格替换为 NUL 字符。我们可以使用sed 命令进一步处理此输出,将这些 NUL 转换为空格:

$ cat /proc/1366/cmdline | sed -e "s/\x00/ /g"; echo
/opt/google/chrome/chrome --enable-crashpad

我们在末尾添加了一个echo 命令,以简单地以换行符结束输出。我们还可以使用其他命令,例如 xargstrstrings 来直接读取带有空格而不是 NUL 的文件:

$ xargs -0 < /proc/1366/cmdline
/opt/google/chrome/chrome --enable-crashpad
$ tr '\0' ' ' < /proc/1366/cmdline; echo
/opt/google/chrome/chrome --enable-crashpad
$ strings /proc/1366/cmdline
/opt/google/chrome/chrome --enable-crashpad