SunOS にはpargs
、実行中のプロセスに渡されたコマンド ライン引数を出力するコマンドがあります。
他の Unix 環境で同様のコマンドはありますか?
いくつかのオプションがあります:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Linuxに関する詳細情報があり/proc/<pid>
ます。
他の Unix では状況が異なる場合があります。ps
コマンドはどこでも機能しますが、OS 固有のもの/proc
です。たとえば、AIX ではcmdline
inはありません/proc
。
これでうまくいきます:
xargs -0 < /proc/<pid>/cmdline
xargsがないと、引数はNULに変換されているため、引数の間にスペースはありません。
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
プロセスのコマンドライン (引数を含む) を取得しますが、すべての空白が NUL 文字に変更されています。
/proc/PID/cmdline
Linux でのスペースを含む印刷の別のバリエーションは次のとおりです。
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
このようにしてNULL 文字をcat
出力し、それを;を使用してスペースに置き換えます。改行を出力します。^@
sed
echo
テキストを変換する上記のすべての方法に加えて、単純に「文字列」を使用すると、デフォルトで別の行に出力されます。端末をスクランブルする可能性のある文字が表示されるのを防ぐこともできるという追加の利点があります.
どちらも 1 つのコマンドで出力されます。
文字列 /proc//cmdline /proc//environ
本当の問題は...実際に実行されたコマンドではなく、変更されたテキストがコマンドラインに含まれるように変更されたLinuxのプロセスの実際のコマンドラインを確認する方法があるかどうかです。
ps -n
Linuxターミナルで試し てください。これは次のように表示されます。
1.すべてのプロセスRUNNING、それらのコマンドラインおよびそれらのPID
その後、どのプロセスを強制終了するかがわかります
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) リリースでテスト済み) を使用し、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