Jawaban:
Ada beberapa opsi:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Ada lebih banyak info di /proc/<pid>
Linux, lihat saja.
Di Unix lain, segalanya mungkin berbeda. The ps
perintah akan bekerja di mana-mana, yang /proc
hal ini OS tertentu. Misalnya pada AIX tidak ada cmdline
di /proc
.
ps -ww -fp <pid>
) untuk menentukan output lebar karena jika ada beberapa perintah, mereka bisa terputus.
-ww
pilihan memungkinkan akses ke argumen baris perintah penuh (sebanyak disimpan oleh kernel). Lihat Juga: bagaimana solaris dan bsd mendapatkan parameter commandline yang tidak digunakan untuk proses dan opsi ps
cat /proc/<pid>/cmdline
juga berfungsi di Cygwin, di mana argumen garis cmd tidak ditampilkan ps
dengan opsi apa pun.
args
, perintahnya adalah ps -o args -p <pid>
dan itu hanya akan mencetak args
atau menggunakan -o cmd
jika Anda hanya perlu melihatnya cmd
. Mencoba membaca /proc/<pid>/cmdline
tidak akan selalu berhasil untuk pengguna yang tidak memiliki privasi. The ps
utilitas akan bekerja.
/proc/<pid>/cmdline
terbatas (kode keras untuk nilai parameter kernel PAGE_SIZE), jadi lebih lama baris perintah masih ditampilkan terpotong! Lihat stackoverflow.com/questions/199130/… untuk info lebih lanjut. Anda dapat menanyakan pengaturan kernel Anda getconf PAGE_SIZE
, biasanya 4096.
Ini akan melakukan trik:
xargs -0 < /proc/<pid>/cmdline
Tanpa xargs, tidak akan ada spasi di antara argumen, karena mereka telah dikonversi ke NUL.
xargs -0 < /proc/<pid>/cmdline
.
Untuk Sistem Linux & Unix dapat Anda gunakan ps -ef | grep process_name
untuk mendapatkan baris perintah penuh.
Pada sistem SunOS, jika Anda ingin mendapatkan baris perintah penuh, Anda dapat menggunakannya
/usr/ucb/ps -auxww | grep -i process_name
Untuk mendapatkan baris perintah penuh, Anda harus menjadi pengguna super.
pargs -a PROCESS_ID
akan memberikan daftar terperinci argumen yang diteruskan ke suatu proses. Ini akan menampilkan array argumen seperti ini:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
Saya tidak menemukan perintah serupa untuk Linux, tetapi saya akan menggunakan perintah berikut untuk mendapatkan hasil yang serupa:
tr '\0' '\n' < /proc/<pid>/environ
Di Linux
cat /proc/<pid>/cmdline
dapatkan baris perintah dari proses (termasuk args) tetapi dengan semua spasi putih berubah menjadi karakter NUL.
Anda dapat menggunakan pgrep
dengan -f
(baris perintah penuh) dan -l
(deskripsi panjang):
pgrep -l -f PatternOfProcess
Metode ini memiliki perbedaan penting dengan salah satu respons lain: ia bekerja di CygWin , sehingga Anda dapat menggunakannya untuk mendapatkan baris perintah penuh dari setiap proses yang berjalan di Windows (dieksekusi sebagai terangkat jika Anda ingin data tentang proses yang ditinggikan / admin) . Metode lain untuk melakukan ini pada Windows lebih canggung ( misalnya ).
Selanjutnya: dalam pengujian saya, cara pgrep telah menjadi satu-satunya sistem yang bekerja untuk mendapatkan path lengkap untuk skrip yang berjalan di dalam python Cygwin .
$ 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
dan 3.3.12
. Hanya mencetak nama pid dan prorgam tanpa argumen.
Varian pencetakan lainnya /proc/PID/cmdline
dengan spasi di Linux adalah:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Dengan cara ini cat
mencetak karakter NULL sebagai ^@
dan kemudian Anda menggantinya dengan spasi menggunakan sed
; echo
mencetak baris baru.
Selain semua cara di atas untuk mengonversi teks, jika Anda cukup menggunakan 'string', itu akan membuat output pada baris yang terpisah secara default. Dengan manfaat tambahan itu juga dapat mencegah karakter apa pun yang dapat mengacak terminal Anda muncul.
Keduanya menghasilkan dalam satu perintah:
string / proc // cmdline / proc // environment
Pertanyaan sebenarnya adalah ... apakah ada cara untuk melihat baris perintah sebenarnya dari suatu proses di Linux yang telah diubah sehingga cmdline berisi teks yang diubah dan bukan perintah sebenarnya yang dijalankan.
Di Linux, dengan bash, untuk menampilkan seperti yang dikutip args sehingga Anda dapat mengedit perintah dan menjalankannya kembali
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
Di Solaris, dengan bash (diuji dengan 3.2.51 (1) -release) dan tanpa gnu userland:
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
Contoh Linux bash (tempel di terminal):
{
## 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
}
Keluaran:
MATCH
Contoh 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
}
Keluaran:
MATCH
tr \\0 ' ' < /proc/<pid>/cmdline