Bagaimana cara mendapatkan hanya pengguna, pid dan perintah dijalankan untuk proses tertentu? (Ubuntu 11.10)

19

Ketika saya melakukannya ps -ef|grep pythonsaya mendapatkan yang berikut:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

Bagaimana saya mendapatkan hanya pengguna yang menjalankan proses, pid dan perintah dijalankan untuk proses seperti pada output berikut?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d
Bentley4
sumber
Apakah ini berhasil? ps --fields="user pid command"
pratnala
Tidak mencobanya. Ditemukan di internet. Tidak di dekat mesin Ubuntu sekarang. Maaf. Akan lihat nanti dan beri tahu Anda
pratnala
Tidak, saya mendapatkan ERROR: Opsi gnu long tidak dikenal. Apakah itu berhasil untuk Anda?
Bentley4

Jawaban:

13

Saya kira Anda mencari argumen -o:

-o format:

format yang ditentukan pengguna. format adalah argumen tunggal dalam bentuk daftar yang dipisahkan-kosong atau dipisahkan-koma, yang menawarkan cara untuk menentukan kolom output individual. Kata kunci yang dikenali dijelaskan di bagian SPESIFIKASI FORMAT STANDAR di bawah ini. Header dapat diganti namanya (ps -o pid, ruser = RealUser -o comm = Command) seperti yang diinginkan. Jika semua tajuk kolom kosong (ps -o pid = -o comm =) maka baris tajuk tidak akan ditampilkan. Lebar kolom akan bertambah sesuai kebutuhan untuk header lebar; ini dapat digunakan untuk memperluas kolom seperti WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Kontrol lebar eksplisit (ps opid, wchan: 42, cmd) juga ditawarkan. Perilaku ps -o pid = X, comm = Y bervariasi dengan kepribadian; output mungkin satu kolom bernama "X, comm = Y" atau dua kolom bernama "X" dan "Y". Gunakan beberapa opsi -o jika ragu. Gunakan variabel lingkungan PS_FORMAT untuk menentukan standar yang diinginkan; DefSysV dan DefBSD adalah makro yang dapat digunakan untuk memilih kolom UNIX atau BSD default.

Jadi perintah yang Anda inginkan adalah (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

di bawah OpenSolaris perintahnya adalah:

ps -o ruser,pid,comm -ef|grep python
Simon
sumber
3
Apakah itu benar-benar bekerja untuk Anda? Ketika saya menjalankan perintah itu saya dapatkanWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4
Ya itu bekerja untuk saya di ksh di bawah OpenSolaris. Outputnya sesuai keinginan Anda ... Periksa halaman manual untuk ps di sistem Anda man ps. Mungkin sintaksnya sedikit berbeda pada sistem Anda.
Simon
1
Tetapi OP sedang bash dan bukan di ksh
pratnala
1
@ Bentley4 Jika Anda hanya menginginkan perintah dan tidak memerlukan informasi tambahan, Anda dapat menghapus argumen -f dan menggunakan perintah berikut:ps -o uid,pid,cmd -e|grep python
Simon
1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon
3

Yang paling sederhana mungkin adalah:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

Dengan begitu Anda mendapatkan semuanya langsung psdan tidak perlu menguraikan apa pun.

Dari pshalaman manual:

-o format Format yang

ditentukan pengguna. format adalah argumen tunggal dalam bentuk daftar yang dipisahkan-kosong atau dipisahkan-koma, yang menawarkan cara untuk menentukan kolom output individual. [...] Header dapat diganti namanya (ps -o pid, ruser = RealUser -o comm = Command) seperti yang diinginkan. Jika semua tajuk kolom kosong (ps -o pid = -o comm =) maka baris tajuk tidak akan ditampilkan.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

The -Cpilihan akan bekerja jika Anda menjalankan pythoninteraktif, tidak jika python berjalan script. Dalam hal ini Anda harus menggunakannya -C scriptname.pysebagai gantinya.

terdon
sumber
1

Versi PS saya berbeda, jadi mungkin memerlukan beberapa penyesuaian, tetapi Anda dapat menggunakan cut (dan mungkin tr tergantung pada apa yang ingin Anda capai) - misalnya sesuatu seperti

ps ef | potong -c1-16,50-   

Akan memberikan karakter 1-16 dan 50 dan seterusnya dari setiap baris pernyataan ps Anda. (Angka Anda yang sebenarnya mungkin perlu sedikit dipijat).

Cara lain untuk melakukannya (tetapi Anda akan kehilangan format) mungkin

ps ef | tr -s "" | potong -f1,2,8- -d ""

Yang akan mengompresi spasi putih di perintah ps, lalu ambil bidang 1,2 dan 8 dan menampilkannya.

davidgo
sumber
Untuk hanya satu proses, saya mendapatkan setengah halaman informasi pada layar penuh dengan perintah-perintah itu. Ini cukup tidak dapat dibaca, saya 'memijat' parameternya tetapi sejauh ini saya belum bisa mendapatkan apa pun dari apa yang saya inginkan.
Bentley4
1
ps -eo user,pid,cmd | grep [p]ython

Contoh:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Penjelasan:

  • -e semua proses
  • -o format yang ditentukan pengguna
  • user,pid,cmd Tampilkan pengguna, ID proses, kolom perintah

Catatan: jika Anda menggunakan -fdengan yang -edisarankan orang lain, Anda mungkin mendapatkan kesalahan. Ini karena kedua parameter ini mengontrol format output, dan hanya satu yang harus digunakan:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
bupupin
sumber