Perintah yang dengannya suatu proses dijalankan

8

Misalkan saya menjalankan proses dengan perintah berikut:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

Setelah beberapa saat aku hanya memiliki piddari myappproses, misalnya 1234. Apakah ada cara untuk mendapatkan perintah dengan semua bendera dan mengarahkan output ke myapp.logentah bagaimana hanya dengan pid?

pengguna3663882
sumber

Jawaban:

10
ps -o args= -p "$pid"

Akan memberi tahu Anda daftar argumen yang diberikan kepada perintah terakhir yang proses dijalankan (atau jika tidak mengeksekusi, yang orang tuanya dieksekusi ...) asalkan proses tidak menimpa daftar argumennya setelah itu.

psakan menunjukkan bahwa daftar arg disatukan dengan spasi dan hingga batas yang mungkin dapat Anda tingkatkan dengan beberapa psimplementasi dengan menambahkan beberapa -wopsi). Di Linux, Anda dapat melihat arglist dipisahkan oleh NUL byte di /proc/$pid/cmdline.

lsof +fg -ap "$pid" -d 0-2

Akan memberi tahu Anda apa yang dimaksud dengan deskriptor file stdin, stdout, dan stderr dan mode mereka dibuka sebagai (seperti hanya W,APuntuk menulis dengan menambahkan seolah-olah >>pengalihan digunakan dalam shell POSIX).

Stéphane Chazelas
sumber
+1 untuk digunakan lsofuntuk mendeteksi bahwa proses diarahkan kemyapp.log
joeytwiddle
1
Cara lain untuk menemukan file output adalah:readlink /proc/$pid/fd/1
joeytwiddle
Aaah, saya mengira OP berarti bendera proses, bukan cetakan dari perintah dan opsinya! Jawaban bagus.
Arronical
4

Anda dapat menggunakan psperintah, dan menentukan pid untuk memeriksa dengan -pswitch, menggunakan -fswitch untuk memberikan daftar lengkap, atau -luntuk daftar panjang yang lebih rinci.

Sebagai contoh untuk output:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

Namun ini menghasilkan baris header, yang mungkin tidak Anda inginkan dalam file log Anda. Anda dapat memotong ini dengan menggunakan -hopsi, jika pid Anda 1234:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

Perhatikan bahwa saya telah mengarahkan output menggunakan >>untuk menambahkan ke file log Anda.

Arronikal
sumber
Untuk menghilangkan baris header tail -n+1(membutuhkan GNU, tetapi Q adalah Linux / Ubuntu). Atau hindari masalah dengan ps -h{f,l}p 1234(juga GNU).
dave_thompson_085
@ dave_thompson_085 terima kasih, saya tahu ada opsi untuk menghapus header, tetapi tidak menggulir cukup jauh ke bawah halaman manual. tail -n1pasti berfungsi di Ubuntu, mengapa +perlu?
Arronical
Saya pikir dave bermaksud menyarankan tail -n+2yang menunjukkan semua baris kecuali yang pertama. tail -n1hanya menampilkan baris terakhir. Bandingkan: seq 1 10 | tail -n+2dan seterusnya.
joeytwiddle
1
@ joeytwiddle ah sekarang saya mengerti, saya diedit untuk memasukkan sarannya untuk digunakan -hkarena menghindari pipa yang tidak perlu dan proses ekstra.
Arronical
1

Menggunakan ps -fAnda dapat memeriksa daftar argumen dan juga dapat mengarahkannya ke file apa pun.

Jadi, dalam hal ini gunakan saja ps -ef | grep 1234 > myapp.log

Silakan periksa halaman manual ps ini .

Harshit
sumber
1
Tidakkah ini juga menampilkan detail dari perintah grep?
Arronical
2
@Arronical Ya, Anda benar. Anda dapat menghindarinya dengan mengecualikan perintah grep:ps -ef | grep 'foo' | grep -v grep
maulinglawns
@maulinglawns itulah yang akan saya lakukan jika saya pergi ke rute grep, memiliki manfaat menghapus header juga.
Arronical
Untuk menghindari grep -vsaya menggunakan trik ini:grep '123[4]'
joeytwiddle