UNIX / Linuxシステムで実行中のプロセスに渡されるコマンドライン引数を取得する方法は?

StackOverflow https://stackoverflow.com/questions/821837

質問

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文字に変更します。

pgrep-f(完全なコマンドライン)および-l(詳細な説明)を使用できます。

pgrep -l -f PatternOfProcess

この方法は、他のどの応答とも重大な違いがあります。 CygWin を使用すると、Windowsで実行されているプロセスの完全なコマンドラインを取得できます(昇格昇格/管理プロセスに関するデータが必要な場合)。 Windowsでこれを行う他の方法は、より厄介です。たとえば
さらに、私のテストでは、pgrepの方法は CygWinのpython内で実行されているスクリプトのフルパスを取得する唯一のシステムでした。

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

  1. プログラムはプロセスを開始します。

その後、どのプロセスを強制終了するかがわかります

Solarisの pargs 、これはLinux <!> amp;で使用できます。 OSX:

ps -ww -o pid,command [-p <pid> ... ]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top