特定/専用PIDに対してのみプロセスを実行する

特定/専用PIDに対してのみプロセスを実行する

頻繁に実行したいACプログラム実行ファイルまたはシェルスクリプトがあります。何かを停止/一時停止または通知したい場合は、プロセスにシグナルを送信します。したがって、毎回プロセスを確認し、それを使用してシグナルを送信する必要がpidあります。kill

毎回pidをチェックし、システムがシャットダウンするまで覚えておく必要がありますが、本当に迷惑です。pidプロセスが特定のプラットフォームでのみ実行されることを望みます。init常に1に走るのと同じです。

関連C APIがありますか?また、bashプログラムスクリプトも必要です。

答え1

PIDを維持または割り当てることができないと思います。ただし、次のスクリプトでプロセスを開始できます。

myprocess &
echo "$!" > /tmp/myprocess.pid

これは他の人が述べたように「pidファイル」を生成します。その後、たとえば$(</tmp/myprocess.pid)またはを使用してbashからインポートできます$(cat /tmp/myprocess.pid)

これを行うときは注意してください。プロセスが終了し、pidがリサイクルされると、誤った信号が送信されます。あなたは確認できます:

pid=$(cat /tmp/myprocess.pid)
if [ "$(ps -o comm= -p "$pid")" = "myprocess" ]; then
    ...send your signal...
else echo "Myprocess is dead!"
fi

"$(ps -o comm= -p "$pid")"変だと思われる方はコメントをご覧ください。誰かがコンテンツに対して疑わしい作業をしている可能性がある場合/tmp/myprocess.pid(他のユーザーがそのコンテンツに書き込んではいけません!)、より強力な検証を実行できます。

答え2

pidを修正することは間違いなく問題を解決するための間違った方法ですが、一部のLinuxバージョンでは、次の値を作成して目的のpidを取得するより良い機会を得ることができます/proc/sys/kernel/ns_last_pid

echo 9999 | sudo tee /proc/sys/kernel/ns_last_pid; ps -C ps
9999
  PID TTY          TIME CMD
10000 pts/3    00:00:00 ps

pid 10000がまだ使用されていない場合にのみ有効です(そして、ns_last_pidの作成とプロセス/スレッドの作成の間にpidまたはスレッドが作成されていません)。

それ以外の場合は、必要なPIDが得られるまで常にフォークできます。

答え3

あなたがしたいのと同じことは、通常、既知のgetpid(2)名前のファイルに自分のpid(取得可能)を書き込むプロセスのライフサイクルの早い段階で行われます。汎用デーモンではこのファイルの名前を一般的に設定できますが、特殊ソフトウェアではハードコードすることもできます。 (でも、少なくともマクロを使用することをお勧めします。)

PIDファイルは通常/ var / runまたは/ runに配置されますが、/ tmpを含む他の場所に配置することもできます。ファイルシステム階層標準によると、「正しい」場所は/runにありますが、/var/runは重要な目的にも使用されます(多くの最新システムの/runと同じ)、/tmpは起動時にroot権限を必要としません(システムデーモンは、プロセスを放棄する前に通常、どの権限を持っているかを確認します。

このファイルは、関連プロセスにシグナルを送信するために関連プロセスのPIDを取得するために、さまざまな方法で読み取ることができます。

答え4

システムレベルのデーモンは、起動中の起動順序に従って割り当てられます。私は固定されたpidをシステムロードや他の依存関係に基づいてカーネルによって割り当てられているので、特定のプロセスに割り当てることは不可能だと思います。

ただし、システムコールを使用すると、固定PIDをプロセスに割り当てることができます。しかし、それを達成する方法がわかりません。

関連情報