217

SunOS にはpargs、実行中のプロセスに渡されたコマンド ライン引数を出力するコマンドがあります。

他の Unix 環境で同様のコマンドはありますか?

4

13 に答える 13

331

いくつかのオプションがあります:

ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo

Linuxに関する詳細情報があり/proc/<pid>ます。

他の Unix では状況が異なる場合があります。psコマンドはどこでも機能しますが、OS 固有のもの/procです。たとえば、AIX ではcmdlineinはありません/proc

于 2009-05-04T20:26:54.397 に答える
64

これでうまくいきます:

xargs -0 < /proc/<pid>/cmdline

xargsがないと、引数はNULに変換されているため、引数の間にスペースはありません。

于 2012-11-15T14:12:12.257 に答える
24

完全なコマンドライン

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
于 2012-11-06T05:40:09.713 に答える
16

Linuxの場合

cat /proc/<pid>/cmdline

プロセスのコマンドライン (引数を含む) を取得しますが、すべての空白が NUL 文字に変更されています。

于 2009-05-04T20:24:56.977 に答える
4

/proc/PID/cmdlineLinux でのスペースを含む印刷の別のバリエーションは次のとおりです。

cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo

このようにしてNULL 文字cat出力し、それを;を使用してスペースに置き換えます。改行を出力します。^@sedecho

于 2013-11-12T10:29:24.837 に答える
1

テキストを変換する上記のすべての方法に加えて、単純に「文字列」を使用すると、デフォルトで別の行に出力されます。端末をスクランブルする可能性のある文字が表示されるのを防ぐこともできるという追加の利点があります.

どちらも 1 つのコマンドで出力されます。

文字列 /proc//cmdline /proc//environ

本当の問題は...実際に実行されたコマンドではなく、変更されたテキストがコマンドラインに含まれるように変更されたLinuxのプロセスの実際のコマンドラインを確認する方法があるかどうかです。

于 2014-09-30T17:07:56.927 に答える
1

ps -nLinuxターミナルで試し てください。これは次のように表示されます。

1.すべてのプロセスRUNNING、それらのコマンドラインおよびそれらのPID

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

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

于 2014-11-24T02:43:43.417 に答える
1

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
于 2016-06-09T22:11:29.300 に答える