如何让命令行parameter passing给unix / linux系统上正在运行的进程?

在SunOS上有pargs命令,它打印传递给正在运行的进程的命令行参数。

在其他Unix环境中是否有类似的命令?

有几个选项:

 ps -fp <pid> cat /proc/<pid>/cmdline 

Linux上/proc/<pid>有更多的信息,只是看看。

在其他Unix上,事情可能会有所不同。 ps命令将在任何地方工作, /proc东西是特定于操作系统的。 例如在AIX上, /proc没有cmdline

这将做的伎俩:

 xargs -0 < /proc/<pid>/cmdline 

没有xargs,参数之间就没有空格,因为它们已经被转换成了NUL。

Linux上

 cat /proc/<pid>/cmdline 

得到你的进程的命令行(包括args),但所有的空格都改为NUL字符。

对于Linux和Unix系统,您可以使用ps -ef | grep process_name ps -ef | grep process_name获得完整的命令行,

在SunOS系统上,如果你想得到完整的命令行,你可以使用/usr/ucb/ps -auxww | grep -i process_name /usr/ucb/ps -auxww | grep -i process_name 。 确保在SunOS获得完整的命令行,你需要成为超级用户。

pargs -a PROCESS_ID 。 这将给出传递给进程的参数的详细列表。 它会给出像argv [o]这样的输出参数数组:first argumen argv [1]:second .. so on ..

我没有find任何类似的命令,但是我会在Linux环境下给出以下命令来获取像tr '\0' '\n' < /proc/<pid>/environ这样的输出。

你可以用-f (完整的命令行)和-l (长描述)使用pgrep

 pgrep -l -f PatternOfProcess 

这个方法与其他任何响应都有着至关重要的区别:它可以在CygWin运行 ,所以你可以使用它来获取在Windows下运行的任何进程的完整命令行(如果你需要升级/pipe理进程的数据, 。 例如 ,在Windows上执行此操作的任何其他方法都比较尴尬。
此外:在我的testing中,pgrep方式是唯一能够获得CygWin python内部脚本完整path的系统

在Linux中带有空格的/proc/PID/cmdline另一个变体是:

 cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo 

通过这种方式, cat打印空字符为^@然后用sedreplace它们; echo打印换行符。

除了上述所有的文本转换方法之外,如果您只是使用“string”,则默认情况下它将在单独的行上生成输出。 有了额外的好处,它也可以防止任何可能扰乱你的terminal出现的字符。

两个输出在一个命令:

strings / proc // cmdline / proc // environ

真正的问题是……有没有办法看到Linux中一个进程的实际命令行已被修改,以便cmdline包含已更改的文本,而不是已运行的实际命令。

在Solaris上

  ps -eo pid,comm 

类似的可以用在unix系统上。

在Linux上,使用bash,输出为引用的参数,以便您可以编辑该命令并重新运行它

 </proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \ bash -c 'printf "%q " "${1}"' /dev/null; echo 

在Solaris上,使用bash(经过3.2.51(1)testing),没有gnu userland:

 IFS=$'\002' tmpargs=( $( pargs "${pid}" \ | /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \ | tr '\n' '\002' ) ) for tmparg in "${tmpargs[@]}"; do printf "%q " "$( echo -e "${tmparg}" )" done; echo 

Linux bash示例(在terminal中粘贴):

 { ## setup intial args argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \ "some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" ) ## run in background "${argv[@]}" & ## recover into eval string that assigns it to argv_recovered eval_me=$( printf "argv_recovered=( " </proc/"${!}"/cmdline xargs --no-run-if-empty -0 -n1 \ bash -c 'printf "%q " "${1}"' /dev/null printf " )\n" ) ## do eval eval "${eval_me}" ## verify match if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ]; then echo MATCH else echo NO MATCH fi } 

输出:

 MATCH 

Solaris Bash示例:

 { ## setup intial args argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \ "some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" ) ## run in background "${argv[@]}" & pargs "${!}" ps -fp "${!}" declare -p tmpargs eval_me=$( printf "argv_recovered=( " IFS=$'\002' tmpargs=( $( pargs "${!}" \ | /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \ | tr '\n' '\002' ) ) for tmparg in "${tmpargs[@]}"; do printf "%q " "$( echo -e "${tmparg}" )" done; echo printf " )\n" ) ## do eval eval "${eval_me}" ## verify match if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ]; then echo MATCH else echo NO MATCH fi } 

输出:

 MATCH 

你可以简单地使用:

 ps -o args= -f -p ProcessPid 

而不是使用多个命令来编辑stream,只需使用one-tr将一个字符转换为另一个字符:

tr'\ 0'''/ cmdline

在linuxterminal中尝试“ps -n”。 这将显示:

1.所有进程RUNNING,其命令行及其PID

  1. 程序启动过程。

之后,你会知道哪个进程杀死