回答:
いくつかのオプションがあります:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
/proc/<pid>Linuxにはもっと多くの情報があります。
他のUnixでは、状況が異なる場合があります。psこのコマンドは、どこでも動作する/procものはOS固有のものです。AIX上の例にはありませんcmdlineでは/proc。
ps -ww -fp <pid>複数のコマンドがある場合、それらが途切れる可能性があるため、ワイド出力を指定するには、おそらく-ww(つまり)が必要になります。
cat /proc/<pid>/cmdlineCygwinでも機能します。コマンドライン引数は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とprorgamの名前を出力するだけです。
/proc/PID/cmdlineLinuxでスペースを使用した印刷の別のバリエーションは次のとおりです。
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
このようにしcatて、NULL文字を asとして出力し^@、次にを使用してそれらをスペースに置き換えますsed。echo改行を出力します。
上記のすべてのテキスト変換方法に加えて、単に「文字列」を使用した場合、デフォルトでは別の行に出力されます。さらに、端末を混乱させる可能性のある文字が表示されないようにすることができるという利点もあります。
1つのコマンドで両方の出力:
文字列/ proc // cmdline / proc // environ
本当の質問は...コマンドラインに実行された実際のコマンドの代わりに変更されたテキストが含まれるように変更されたLinuxのプロセスの実際のコマンドラインを確認する方法はありますか。
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ユーザーランドなし:
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