GNU/Linux >> Linux の 問題 >  >> Linux

プロセスがps出力で異なる名前を持っているように見えるのはなぜですか?

プロセス リスト内の名前を操作することは、一般的な方法です。例えば。私は次のリストを作成中です:

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 はこのメカニズムを使用して、各プロセスが何をしているかを簡単に表示します。

基本的に argv[0] を操作するのと同じくらい簡単です C のパラメータ。 argv プロセスが開始されたパラメーターへのポインターの配列です。コマンド ls -l /some/directory

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

いくつかのメモリを割り当て、そのメモリにテキストを入れ、そのメモリのアドレスを argv[0] に入れます。 表示されるプロセス名は新しいテキストに変更されます。


argv[] の変更は移植性がありません。 Linux では、単純に argv[0] をより長い文字列を指すように変更することもできません。既存の引数を上書きし、アドレス空間に続く環境変数を上書きしないように注意する必要があります.

libbsd は、これをより簡単にする Linux 用の setproctitle(3) の実装を提供します。


これを行う Linux 標準の方法が 2 つあります。そのうちの 1 つは glibc から来ており、他の非 Linux システムに移植できる可能性があります。

  • glibc pthread_setname_np() おそらくより良い方法です
  • Linux prctl() も機能します

argv[0] を変更する可能性があります 以前は機能していましたが、少なくとも現在の Linux システムでは ps の出力には何もしません。 .

詳細とコード例については、この回答を参照してください:https://stackoverflow.com/a/55584492/737303


Linux
  1. PID ではなく名前でプロセスを強制終了するにはどうすればよいですか?

  2. プロセスが持つことができるさまざまな UID のそれぞれの目的は何ですか?

  3. Linuxでプロセス名を指定してプロセスIDのみを取得するには?

  1. tcpdump でファイルに書き込み、標準出力に適切なデータを出力するにはどうすればよいですか?

  2. スワップを使用しているプロセスを知るにはどうすればよいですか?

  3. 変更された dmesg 出力を確認するにはどうすればよいですか?

  1. ps出力をプロセス開始時間でソートする方法は?

  2. du -h 出力をサイズでソートするにはどうすればよいですか

  3. lsof - 出力を物理ファイルのみに制限する - どのように?