在SunOS上,有一个pargs命令用于打印传递给正在运行的进程的命令行参数。
在其他Unix环境中是否有类似的命令?
在SunOS上,有一个pargs命令用于打印传递给正在运行的进程的命令行参数。
在其他Unix环境中是否有类似的命令?
当前回答
在Linux终端上尝试ps -n。这将显示:
1.所有正在运行的进程,它们的命令行和pid
程序启动进程。
之后,您将知道该终止哪个进程
其他回答
Linux中用空格打印/proc/PID/cmdline的另一个变体是:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
这样,cat将NULL字符打印为^@,然后使用sed将它们替换为空格;Echo输出换行符。
在Linux终端上尝试ps -n。这将显示:
1.所有正在运行的进程,它们的命令行和pid
程序启动进程。
之后,您将知道该终止哪个进程
你可以简单地使用:
ps -o args= -f -p ProcessPid
在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)-release测试),没有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示例(粘贴到终端):
{
## 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
这样就可以了:
xargs -0 < /proc/<pid>/cmdline
如果没有xargs,参数之间将没有空格,因为它们已被转换为NULs。