GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana suatu proses tampaknya memiliki nama yang berbeda dalam keluaran ps?

Memanipulasi nama dalam daftar proses adalah praktik umum. Misalnya. Saya memiliki daftar berikut dalam proses saya:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]

Dovecot menggunakan mekanisme ini untuk menunjukkan dengan mudah apa yang dilakukan setiap proses.

Ini pada dasarnya sesederhana memanipulasi argv[0] parameter dalam C. argv adalah larik penunjuk ke parameter yang dengannya proses telah dimulai. Jadi perintah ls -l /some/directory akan memiliki:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

Dengan mengalokasikan sebagian memori, memasukkan beberapa teks ke dalam memori itu, lalu memasukkan alamat memori itu ke dalam argv[0] nama proses yang ditampilkan akan dimodifikasi menjadi teks baru.


Mengubah argv[] tidak portabel. Di Linux Anda tidak bisa begitu saja mengubah argv[0] untuk menunjuk ke string yang lebih panjang. Anda harus menimpa argumen yang ada dan berhati-hati agar tidak menimpa variabel lingkungan yang mengikuti di ruang alamat.

libbsd menyediakan implementasi setproctitle(3) untuk Linux yang membuatnya lebih mudah.


Ada dua cara standar Linux untuk melakukannya, salah satunya berasal dari glibc dan mungkin portabel untuk sistem non-Linux lainnya:

  • glibc pthread_setname_np() mungkin metode yang lebih baik
  • Linux prctl() juga berfungsi

Mungkin saja mengubah argv[0] dulu berfungsi, tetapi setidaknya pada sistem Linux saya saat ini tidak melakukan apa pun pada keluaran di ps .

Lihat jawaban ini untuk detail lebih lanjut dan contoh kode:https://stackoverflow.com/a/55584492/737303


Linux
  1. Bagaimana cara mendapatkan hanya ID proses dalam menentukan nama proses di linux?

  2. Bagaimana saya bisa membuat tcpdump menulis ke file dan menghasilkan data standar yang sesuai?

  3. Bagaimana saya bisa tahu proses mana yang menggunakan swap?

  1. Bagaimana cara mendapatkan semua id proses yang sedang berjalan saja?

  2. Bagaimana Mengidentifikasi Port ke Suatu Proses?

  3. Bagaimana saya bisa melihat keluaran dmesg saat berubah?

  1. Bisakah suatu proses memiliki pemilik? Apa artinya?

  2. Bagaimana saya bisa mengurutkan output du -h berdasarkan ukuran

  3. lsof - batasi output hanya ke file fisik - bagaimana caranya?