Cara menggunakan perintah 'top' dan 'USER' bersama

1

Saya mendapat persyaratan untuk memfilter hasil proses dengan konteks pengguna. Saya menggunakan perintah like.

# top -b -n 1 -p $(pgrep -d',' http)
top - 14:44:13 up 7 days,  3:01,  6 users,  load average: 0.05, 0.01, 0.00
Tasks:   3 total,   0 running,   3 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  1.4%sy,  0.0%ni, 97.4%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8062112k total,  4471344k used,  3590768k free,   176040k buffers
Swap:  6160376k total,       88k used,  6160288k free,   797580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
27720 root      20   0  175m 3708 1408 S  0.0  0.0   0:05.79 httpd              
27722 daemon    20   0  175m 3076  708 S  0.0  0.0   0:00.00 httpd              
27723 daemon    20   0 2417m 176m  13m S  0.0  2.2   0:43.19 httpd  

Dan saya ingin mendapatkan 'proses id' yang berada di bawah konteks pengguna 'root'.

kgopi
sumber

Jawaban:

1

pgrep mendukung pemfilteran oleh pengguna proses juga:

pgrep -u root httpd

Jika Anda ingin mengekstrak PID dari topoutput Anda , coba ini awksatu-baris:

($NF=="httpd" && $2=="root") {print $1}

misalnya

top -b -n 1 -p $(pgrep -d',' http) | 
  gawk '($NF=="httpd" && $2=="root") {print $1}'

Pilihan lain yang terkadang bermanfaat pgrepadalah -ountuk proses pencocokan terlama, yang seharusnya menjadi httpdproses pendengar tingkat atas (pgrep cukup pintar untuk mencoba melakukan hal yang benar ketika proses pencocokan memiliki waktu mulai yang "sama").

Apache juga biasanya dikonfigurasikan untuk merekam file pid, biasanya di suatu tempat seperti /usr/local/apache2/logs/httpd.pid atau /var/run/httpd.pid, yang harus mengandung PID tingkat atas juga (meskipun itu sedikit kurang dapat dipercaya karena bisa basi).

mr.spuratic
sumber
0

Di Linux, dengan asumsi /proctersedia (jika tidak, Anda mungkin memiliki masalah lebih besar untuk mendapatkan tampilan lengkap dari proses yang sedang berjalan), Anda bisa mendapatkan PID dari semua proses yang termasuk rootmenggunakan perintah seperti berikut:

find /proc -maxdepth 1 -type d -regex '^/proc/[1-9][0-9]*$' -uid 0 -print \
| sed 's,/proc/,,g'

Sebenarnya, ini akan mendaftar semua direktori langsung di dalam / proc yang memiliki nama yang dimulai dengan angka bukan nol diikuti oleh sejumlah digit. Ini kemudian digunakan seduntuk menghapus /proc/di awal setiap baris output, meninggalkan Anda hanya dengan PID numerik.

Hasil dari ini dapat diteruskan lebih lanjut ke proses apa pun yang Anda suka; itu hanya akan menjadi daftar PID, satu per baris. Sebagai contoh, Anda bisa menyalurkan output ke loop seperti yang while read pid; do something $pid; doneharus dilakukan somethinguntuk setiap PID secara bergantian.

Pada sistem saya, output tampaknya diurutkan secara numerik tapi saya tidak berpikir Anda bisa mengandalkan itu selalu terjadi. sortakan berguna jika tidak (dan tergantung pada apa yang ingin Anda lakukan, Anda mungkin tertarik pada sesuatu seperti sort -rnuntuk jenis numerik terbalik).

Bagian -uid 0dapat diganti untuk referensi UID numerik apa pun yang Anda inginkan (atau lihat findhalaman manual untuk kemungkinan lain; misalnya, -gid). Jika Anda tertarik pada proses Anda sendiri daripada root, sesuatu seperti id -uakan sangat berguna ( -uid $(id -u)).

sebuah CVn
sumber
0

Alat terbaik untuk ini mungkin adalah ps:

   ps displays information about a selection of the active
   processes.  If you want a repetitive update of the selection
   and the displayed information, use top(1) instead.

Opsi yang relevan di sini adalah:

   -C cmdlist
          Select by command name.  This selects the processes
          whose executable name is given in cmdlist.
   -o format
          User-defined format.  format is a single argument in
          the form of a blank-separated or comma-separated list,
          which offers a way to specify individual output
          columns.  The recognized keywords are described in the
          STANDARD FORMAT SPECIFIERS section below. 

Jadi, untuk menemukan semua httpdproses yang telah diluncurkan oleh root:

$ ps -C httpd -o pid,user
  PID USER
27720 root
27722 daemon
27723 daemon

Secara teoretis. melewati -u rootopsi untuk psmengembalikan hanya proses-proses yang dijalankan roottetapi itu tidak bekerja pada sistem saya, tidak yakin mengapa. Jadi kami menguraikan:

$ ps -C httpd -o pid,user | gawk '$2==root{print $1}'
27720
terdon
sumber
Sementara itu yang biasa terjadi (dan memang demikian halnya dalam contoh khusus ini), perlu dicatat bahwa ekspresi awk tergantung pada kenyataan bahwa nama pengguna yang diinginkan tidak mengandung spasi.
CVn
@ MichaelKjörling dapatkah nama pengguna * nix berisi spasi putih?
terdon
Poin bagus, Anda menangkap saya tentang hal itu. Saya tidak yakin, tetapi terutama di lingkungan campuran, saya tidak benar-benar mengerti mengapa tidak.
CVn
Saya akan berpikir bahwa itu tidak bisa tepat karena itu akan menyebabkan masalah seperti apa yang Anda sarankan :). Bagaimanapun, debian saya tidak akan membiarkan saya membuat nama pengguna yang berisi spasi dan saya benar-benar ragu bahwa * nix akan melakukannya.
terdon
Apa yang dapat Anda lakukan dengan alat adalah satu hal; apa yang dapat Anda lakukan peretasan /etc/ passwd (yang akan lebih dekat dengan "bisa?") adalah sesuatu yang sangat berbeda. :)
CVn