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

Linux で特定のプログラムのプロセス ID を設定する方法

実は、これを行う方法があります。 CONFIG_CHECKPOINT_RESTORE が設定されたカーネル 3.3 以降 (ほとんどのディストリビューションで設定されています)、カーネルによって生成された最後の pid を含む /proc/sys/kernel/ns_last_pid があります。そのため、フォークされたプログラムに PID を設定する場合は、次のアクションを実行する必要があります:

<オール>
  • /proc/sys/kernel/ns_last_pid を開いて fd を取得
  • LOCK_EXで群れをなす
  • PID-1 を書く
  • フォーク
  • ほら!子はあなたが望んでいた PID を持っています。また、ロックを解除 (LOCK_UN で群れ) し、ns_last_pid を閉じることを忘れないでください。

    ここの私のブログで C コードをチェックアウトできます。


    多くの人がすでに示唆しているように、PID を直接設定することはできませんが、通常、シェルには最後にフォークされたプロセス ID を知る機能があります。

    たとえば、bash では、バックグラウンドで実行可能ファイルを起動できます (& を追加) ) 変数 $! でその PID を見つけます .例:

    $ lsof >/dev/null &
    [1] 15458
    $ echo $!
    15458
    

    CentOS7.2 では、次の操作を簡単に行うことができます:

    1894 の PID でスリープ コマンドを実行するとします。

    sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
    

    (ただし、echo コマンドと sleep コマンドの間の非常に短い時間内に別のプロセスが実行された場合、PID が 1895+ になる可能性があることに注意してください。何百回もテストしましたが、発生したことはありません。 PID を保証したい場合は、書き込み後にファイルをロックし、sleep を実行してから、上記の Ruslan の回答で提案されているようにファイルのロックを解除する必要があります。)


    Linux
    1. Linux – Linuxでプロセスのプロセッサ親和性を設定するにはどうすればよいですか?

    2. Linuxの特定のポートで実行されているプロセスを強制終了する方法は?

    3. Linux プロセス管理用の Python ライブラリ

    1. Linux –現在のプロセスでネットワークの共有を解除する方法は?

    2. Linuxで実行中のプロセスを再起動(またはリセット)する方法は?

    3. Linux で特定のユーザーに対して特定のコマンドを無効にする方法

    1. Linux で C または C++ からプロセスの CPU アフィニティを設定する方法は?

    2. 特定のプロセスで実行されるユーザー、pid、およびコマンドのみを取得するにはどうすればよいですか? (Ubuntu 11.10)

    3. Linux のプロセスごとの swapiness を設定するには?