Bagaimana saya bisa mendapatkan argumen perintah atau seluruh baris perintah dari proses yang sedang berjalan menggunakan nama prosesnya?
Misalnya proses ini:
# ps
PID USER TIME COMMAND
1452 root 0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
Dan yang saya inginkan adalah /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
argumen. Saya tahu nama proses dan ingin argumennya. Saya menggunakan Busybox di SliTaz.
ps
(tidak disarankan) atau Anda mencari beberapa perintah alternatifps
yang akan memberi Anda output? Apa yang perlu dilakukan ketikaps
memberikan beberapa jalur output? cetak semua / pertama / terakhir?arg
seperticommand
per @ John jawabannya ?pidof <process name>
ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Tapi dengan cara ini saya tidak mendapatkan argumen dalam satu variabelJawaban:
Anda bisa menggunakan
-o
sakelar untuk menentukan format output Anda:Dari halaman manual :
Anda juga dapat menggunakan
-p
sakelar untuk memilih PID tertentu:pidof
juga dapat digunakan untuk beralih dari nama proses ke PID, karenanya memungkinkan penggunaan-p
dengan nama:Tentu saja, Anda juga dapat menggunakan
grep
ini (dalam hal ini, Anda harus menambahkan-e
sakelar):GNU ps juga akan memungkinkan Anda untuk menghapus header (tentu saja, ini tidak perlu saat menggunakan
grep
):Pada sistem lain, Anda dapat mengirim ke AWK atau sed:
Sunting: jika Anda ingin menangkap baris ini menjadi variabel, cukup gunakan
$(...)
seperti biasa:atau, dengan
grep
:sumber
args
dengancommand
(ataucmd
).cmd
dancommand
aliasargs
, ini mungkin tidak perlu.grep
untuk menangkap garis Anda benar-benar tertarik:ps -eo args | grep dhcpcd | head -n -1
. Saya mengedit jawaban saya.Coba sesuatu seperti ini:
(contoh output dari busybox di OpenWrt di salah satu router saya)
/proc/$PID/cmdline
berisi argumen proses$PID
seperti string C-ish satu demi satu. Setiap string diakhiri nol.Kutipan di sekitar beberapa argumen atau opsi adalah barang shell. Anda harus melihat lebih dekat pada garis yang ditampilkan dan di mana spasi atau karakter lain dengan makna khusus untuk shell digunakan. Anda perlu mengutip karakter itu entah bagaimana atau argumen lengkap ketika bergabung dengan baris ini ke baris perintah lagi.
sumber
tr "\0" " " </proc/991/cmdline
\0
dengan `` menjadi buruk, tapi saya pikirtr '\0' '\n' < /proc/$foo/cmdline
sedikit lebih sederhana daripadaxargs
.printf
membuatnya lebih mudah untuk menambahkan kutipan ke output, menyisipkan spasi, bukan baris baru dan sebagainya. Ketika berpikir untuk menambahkan lebih banyak pemrosesan, jalan keluarprintf
adalah awal yang baik.Metode # 1 - Menggunakan ps
Anda bisa menggunakannya
ps -eaf | grep 1234
.Contoh
CATATAN: Busybox's
ps
tidak menyertakan-eaf
sakelar seperti yang ditunjukkan di atas dari tipikalps
yang disertakan dengan sebagian besar Linux, namun Busybox'sps
menunjukkan apa yang tampak seperti output yang sangat mirip dengan contoh yang saya berikan. Anda dapat menginstal Busybox di sebagian besar Linux dan menjalankannya seperti ini:Metode # 2 - Menggunakan / proc
Anda juga dapat melihat
cmdline
file yang dimiliki masing-masing PID/proc/<pid>
.Tetapi perhatikan bahwa itu tidak ada spasi. Ini disebabkan oleh karakter NUL yang digunakan dalam file ini untuk memisahkan argumen baris perintah Anda. Tidak perlu khawatir, ini bisa dilucuti.
Referensi
sumber
Mengetahui PID, hanya eksekutif
Misalnya, untuk PID = 127
sumber