如何让命令行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
打印空字符为^@
然后用sed
replace它们; 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
- 程序启动过程。
之后,你会知道哪个进程杀死