start.sh
スクリプトから始めてPIDを保存するためのいくつかのコマンドがあります。その後、stop.sh
ユーザーに便利な時間に実行してブロックしたいと思います。
トラップに注意してください。
- 今日実行しましたが、
start.sh
PIDがファイルに保存されました。15000
15001
15002
- プロセスを停止するのを忘れました。 1週間後にコンピュータを再起動しました。
- これでスクリプトを実行します。 PIDを持つジョブを終了しようとし、
stop.sh
無意識のうちにファイルからそのジョブを読み取ります。 =>新しく再起動したシステムにこれらのPIDがある場合、これらの操作はスクリプトを介して開始されたものではなく、システムが不明なままになります。15000
15001
15002
start.sh
LinuxスクリプトでプロセスのPIDを初めてキャプチャするときに、$$
後で同じPIDを使用して発生する可能性がある他の操作と混同しないように追加情報を収集するにはどうすればよいですか?
たとえば、PPIDを収集したり、開始日時を収集したり、ある種の「ユニバーサルユニーク性」を保証したりするなどのコンテンツを作成できます。
プロセス情報を収集する方法と混乱せずにプロセス情報を終了する方法は?
答え1
プロセス情報を収集する方法と混乱せずにプロセス情報を終了する方法は?
知りません。
代わりに、後で再検索するために確実に参照できるコンテキスト内でプロセスが実行されていることを確認してください。
これ正しいこの問題を解決する方法は、ターゲットプラットフォームのサービス管理システム(現在は通常Linuxシステムでシステム化されています)を使用することです。彼らはほとんどの場合、仕事を正しく処理し、特にデザイン済みこれをやってください。
好みの高い順に、代替は次のとおりです。
- 使うグループ具体的な名前をつけてください。このアプローチはLinuxにのみ適用されますが、安定して原子的にシャットダウンする機能など、多くの明白な利点があります。みんな起動したプロセスの子プロセスです。 PID が cgroup に関連付けられるのではなく、特定のプロセスが cgroup に明示的に関連付けられるため、これは本質的にライフサイクルの問題を解決します。
- 監督システムを使用します。走る、s6またはデーモンツール。これらのソリューションは、監視したいプロセスの親プロセスであり、簡単で信頼性の高いプロセスを活用して問題を解決します。
- PIDファイルを
/run
必要な場所に置きます。システムの再起動時にPIDを再利用する際に指摘された問題は、既知の問題で確実に解決されました。数十年システムが再起動されるたびに消去されるディレクトリにPIDファイルを置くだけです。/run
Linux システムの標準位置です。これはまだPIDの再利用の問題を表しています。 PID は関連プロセスの存続期間中に固有であるため、予期せず終了し、PID ファイルを残しているプロセスの 1 つで再利用の問題が発生する可能性があります。
答え2
大規模ネットワークでさまざまな診断スクリプトを実行する必要がある場合は、すべてのスクリプトで--tag=....
オプションを受け入れ(無視)します。 (明らかに標準コマンドを使用してこれを行うことはできませんが、親シェルでそれをラップできます。)
一般的な--tagには、それを開始したホスト名、nonce、および開始時間(ナノ秒まで)が(少なくとも)含まれます。リモート操作の場合、リモートシステムのPIDがわからない場合があります。
このps
コマンドは、特定のプロセスに対してgrepできるようにパラメーターを表示できます。潜在的なプロセスに関するレポートを定期的に生成し、リストから終了したプロセスを消去するcronジョブを持つこともできます。
答え3
PID情報をtmpfsファイルシステムに保存すると、再起動後にファイルは存在しません。
/run
通常はtmpfs、または/tmp
一部のディストリビューションではtmpfsです。
または直接インストール
# mount tmpfs /path/to/your/mountpoint -t tmpfs
答え4
/proc/15000
start.shを別のディレクトリにバインドしてインストールします。 (競合状態を避けるために終了する前に親プロセスで実行することをお勧めしますwait
。)stop.shでバインドマウントされたディレクトリを開きます。バンドルマウントが消えると、システムが再起動します。 ESRCH(No such process)でディレクトリを開くことが失敗すると、プロセスは終了します。 (これは、同じPIDを持つ新しいプロセスが後で実行を開始した場合にも発生します。)ディレクトリを開くことに成功し、バインドマウントがまだ存在する場合、そのプロセスはまだプロセスであるため、安全に終了できます。 (他の競合状態を避けるためには、その条件を終了するのが最善ですpidfd_send_signal
。)