Answers:
有几种选择:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
/proc/<pid>
在Linux上有更多信息,请看一看。
在其他Unix上,情况可能有所不同。该ps
命令将随处可见,/proc
具体内容取决于操作系统。例如,在AIX上没有cmdline
in /proc
。
ps -ww -fp <pid>
)来指定宽输出,因为如果有多个命令,它们可能会被切断。
cat /proc/<pid>/cmdline
也适用于Cygwin,其中cmd行参数不显示ps
任何选项。
args
,则命令为ps -o args -p <pid>
,并且仅当您需要查看时,它才会打印args
或使用-o 。对于非特权用户,尝试阅读并不总是可行。的cmd
cmd
/proc/<pid>/cmdline
ps
实用程序将起作用。
/proc/<pid>/cmdline
是有限的(硬编码为PAGE_SIZE内核参数的值),因此较长的命令行仍被截断!有关更多信息,请参见stackoverflow.com/questions/199130/…。你可以查询你的内核设置getconf PAGE_SIZE
,它通常是4096
这将达到目的:
xargs -0 < /proc/<pid>/cmdline
如果没有xargs,则参数之间将没有空格,因为它们已转换为NUL。
xargs -0 < /proc/<pid>/cmdline
。
对于Linux和Unix系统,您可以使用ps -ef | grep process_name
来获取完整的命令行。
在SunOS系统上,如果要获取完整的命令行,可以使用
/usr/ucb/ps -auxww | grep -i process_name
要获得完整的命令行,您需要成为超级用户。
pargs -a PROCESS_ID
将给出传递给过程的参数的详细列表。它将以如下形式输出参数数组:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
我没有找到用于Linux的任何类似命令,但是我将使用以下命令来获取类似的输出:
tr '\0' '\n' < /proc/<pid>/environ
在Linux上
cat /proc/<pid>/cmdline
为您提供过程的命令行(包括args),但所有空格均更改为NUL字符。
你可以用pgrep
与-f
(完整命令行)和-l
(长说明):
pgrep -l -f PatternOfProcess
此方法与其他任何响应都有一个关键的区别:它在CygWin上有效,因此您可以使用它来获取Windows下运行的任何进程的完整命令行(如果您需要有关任何提升/管理进程的数据,请以提升方式执行) 。在Windows上执行此操作的任何其他方法都比较笨拙(例如)。
此外:在我的测试中,pgrep方法是唯一一个为CygWin的python内部运行的脚本获取完整路径的系统。
$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
pgrep from procps-ng 3.3.15
和对我不起作用3.3.12
。只打印不带参数的pid和proggam名称。
/proc/PID/cmdline
在Linux中使用空格打印的另一种形式是:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
这样,将NULL字符cat
打印为,然后使用;将它们替换为空格。打印换行符。^@
sed
echo
在Linux上,使用bash,输出为带引号的args,以便您可以编辑命令并重新运行它
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
在Solaris上,具有bash(已在3.2.51(1)-发行版中进行测试)并且没有gnu用户态:
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示例(粘贴在终端中):
{
## 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
tr \\0 ' ' < /proc/<pid>/cmdline