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

Linux でプロセス名を変更する

コメントの 1 つに prctl が言及されています 、しかし、これは本当に独自の答えに値します。なぜなら、設定 argv[0] すべての場合に機能するとは限りません (私のシステムでは何もしません)。

Linux でスレッドの名前を設定するためのライブラリ呼び出しが少なくとも 2 つあります。どちらも 15 文字に制限されており、最後に NUL が付きます。 バイト:

<オール>
  • glibc 固有:pthread_setname_np(...) np 「非移植性」の略ですが、これは他の OS にも存在する可能性があります:https://linux.die.net/man/3/pthread_setname_np
  • Linux 固有:prctl(PR_SET_NAME...) これも移植性がありません:https://linux.die.net/man/2/prctl
  • さまざまなメソッドのテストを次に示します (エラー処理なし):

    // gcc pstest.c -o pstest -O2 -Wall -Wextra -Werror -Wno-unused -Wno-unused-result -std=gnu99 -pthread -D_GNU_SOURCE 
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <sys/prctl.h>
    
    int main(int argc, char *argv[])
    {
        puts("Initial ps output:");
        system("ps | grep pstest");
    
        puts("\npthread_setname_np");
        pthread_setname_np(pthread_self(), "setname");
        system("ps | grep setname");
    
        puts("\nprctl");
        prctl(PR_SET_NAME, (unsigned long)"prctl", 0, 0, 0);
        system("ps | grep prctl");
    
        puts("\nargv[0]");
        argv[0] = "argv0";
        system("ps | grep argv0");
    
        return 0;
    }
    

    argv[0] の後に出力がないことに注意してください :

    ./pstest
    Initial ps output:
    17169 pts/0    00:00:00 pstest
    
    pthread_setname_np
    17169 pts/0    00:00:00 setname
    
    prctl
    17169 pts/0    00:00:00 prctl
    
    argv[0]
    

    野生

    実稼働コードの例を次に示します (いつものように、GitHub でコードを見るときは必ずライセンスに注意してください)

    こちらもご覧ください

    これらの質問と回答も参照してください:

    • https://unix.stackexchange.com/questions/167490/how-can-a-process-appear-to-have-different-name-in-ps-output
    • prctl PR_SET_NAME を使用してプロセスまたはスレッドの名前を設定しますか?

    原則を説明するために、これは機能するはずだと思います...

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      argv[0][0] = 65;
      sleep(10);
    }
    

    名前を変更し、最初の文字の代わりに「A」を付けます。 CtrlZ で一時停止してから ps を実行します 名前が変更されたことを確認します。手がかりはありませんが、 argv[0] に依存している可能性があるため、やや危険なようです。 .

    また、ポインター自体を別の文字列に置き換えてみました。葉巻はありません。したがって、これは strcpy でのみ機能します 元の名前よりも短いか等しい文字列。

    これにはもっと良い方法があるかもしれませんし、ないかもしれません。わかりません。

    編集:非リテラルの解決策:分岐している場合は、子の PID (getpid()) を知っています。 子では、fork() の結果 親で)。読める場所に出力して、PID で子を殺してください。

    別の非リテラルな解決策:実行可能ファイルへのソフトリンクを別の名前 (ln -s a.out kill_this_a.out) で作成します。 )、実行するときに、リンクを実行します。この名前がリンクの名前になります。


    これは移植性のないハックです:

    /*
     * Sets process title, truncating if there is not enough space, 
     * rather than causing memory corruption.
     */
    void set_title_np(int argc, char **argv, const char *title) {
        // calculate available size
        size_t space = 0;
        for (int i = 0; i < argc; i++) {
            size_t length = strlen(argv[i]);
            space += length + 1; // because of terminating zero 
        }
        memset(argv[0], '\0', space); // wipe existing args
        strncpy(argv[0], title, space - 1); // -1: leave null termination, if title bigger than space
    } 
    

    このコメントによると、 prctl(PR_SET_NAME) スレッドの「短い名前」にのみ影響します。 /proc/self/comm に書き込むのと同じ効果があります .

    「長い名前」(/proc/self/cmdline)を変更するには htop で実際に使用されています と ps u )醜いハックが必要です(そのコメントに記載されていますが、リンクは無効です)。この種のハッキングの例は、Chromium ソース コードにあります:https://source.chromium.org/chromium/chromium/src/+/master:content/common/set_process_title_linux.cc


    Linux
    1. UNIX / Linux :プロセスのナイスネス (優先度) を変更する方法

    2. PID ではなくプロセス名で Java プロセスを (Linux で) 強制終了します。

    3. prctl PR_SET_NAME を使用してプロセスまたはスレッドの名前を設定しますか?

    1. WINDOWS10をLINUXに変更する10の理由

    2. Linux でユーザー名を変更する

    3. Linux でのファイル変更時にプロセスを再起動する

    1. Linux コマンドは名前で tomcat プロセス ID を取得します

    2. Linuxでのpidからのプロセス名

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