UNIX / Linuxシステムで実行中のプロセスに渡されるコマンドライン引数を取得する方法は?
質問
SunOSには、実行中のプロセスに渡されるコマンドライン引数を出力するpargs
コマンドがあります。
他のUnix環境にも同様のコマンドはありますか?
解決
いくつかのオプションがあります:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Linuxの/proc/<pid>
に詳細があります。ご覧ください。
他のUnixでは状況が異なる場合があります。 ps
コマンドはどこでも機能し、/proc
の内容はOS固有です。たとえば、AIXでは、cmdline
に<=>はありません。
他のヒント
これはトリックを実行します:
xargs -0 < /proc/<pid>/cmdline
xargsがない場合、引数はNULに変換されているため、引数間にスペースはありません。
完全なコマンドライン
Linuxの場合<!> amp; 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文字に変更します。
Linuxでスペースを使用して印刷する/proc/PID/cmdline
の別のバリエーションは次のとおりです。
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
この方法でcat
は NULL文字を^@
として印刷し、それらを置き換えますsed
を使用してスペースを入れます。 echo
改行を出力します。
複数のコマンドを使用してストリームを編集するのではなく、1つのコマンドを使用するだけです。trは1つの文字を別の文字に変換します。
tr '\0' ' ' </proc/<pid>/cmdline
テキストを変換する上記のすべての方法に加えて、単に「文字列」を使用する場合、デフォルトで別々の行に出力されます。端末にスクランブルをかける可能性のある文字が表示されないようにすることもできるという追加の利点があります。
1つのコマンドでの両方の出力:
strings / proc // cmdline / proc // environ
本当の質問は...実行された実際のコマンドの代わりに変更されたテキストがcmdlineに含まれるように変更されたLinuxのプロセスの実際のコマンドラインを表示する方法があります。
Solaris
の場合 ps -eo pid,comm
similarは、Unixのようなシステムで使用できます。
bashを使用するLinuxでは、コマンドを編集して再実行できるように、引用符付き引数として出力します
</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
}
出力:
<*>単純に使用できます:
ps -o args= -f -p ProcessPid
try <!> quot; ps -n <!> quot; Linuxターミナルで。これは表示されます:
1。実行中のすべてのプロセス、コマンドライン、およびPID
- プログラムはプロセスを開始します。
その後、どのプロセスを強制終了するかがわかります
Solarisの pargs 、これはLinux <!> amp;で使用できます。 OSX:
ps -ww -o pid,command [-p <pid> ... ]