web-dev-qa-db-ja.com

シグナルまたは/ procを介してプロセスをスリープ状態から起動するにはどうすればよいですか?

何年も前に、Linuxでプロセスがランダムにスリープ状態になる問題がありました。その当時、私は/procファイルシステムでプロセスのウェイクアップをトリガーするトリックを知っていました。 "echo R" >/proc/pid/statのようなことができることを漠然と覚えていますが、それは適切なコマンドではないようです。

「眠っているプロセスを起こすにはどうすればよいですか」というインターネット上のヒットはたくさんあります。そして答えの多くは「ああ、ただ殺せ!」別の方法があることは知っていますが、私の記憶は今私を失敗させています。

これまでのところ、私は試しました:

kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
6
Peter Grace

「眠る」とはどういう意味ですか?

状態S(割り込み可能なスリープ)を意味する場合は、プロセスがI/Oを待機していることを意味します。プロセスは現在、ブロッキングシステムコールに従事しています。一般的な方法で強制的に「ウェイクアップ」させることはできません。その場合、何をしますか?実行したい入力または出力操作が可能になると(たとえば、データを読み取ることができるとき、書き込みチャネルが準備ができたときなど)、ウェイクアップします。

状態T(停止)を意味する場合は、プロセスが現在中断されていることを意味します。 CONTシグナル(SIGCONT)を送信することで、中断を解除できます:kill -CONT PID

プロセスは「ランダムにスリープ状態になる」ことはありません。彼らは何もしないときに寝ます。停止するシグナル(SIGTSTP、SIGSTOP、SIGTTIN、SIGTTOU)を受信した場合は、中断されます。これらの最後の2つの信号は、バックグラウンドプロセスが端末から読み取ろうとする(または端末に書き込む)ときに、カーネルの端末インターフェイスによって送信されます。それを知らない場合は、プロセスがランダムに停止すると考えるかもしれません。それが起こった場合は、それを前面に持ってくる必要があります。そのバックグラウンドジョブを開始したシェルでfgを実行します。適切な引数を使用して、プロセスが含まれているジョブを示します。 fg %3

stat* Linuxのファイル/procは読み取り専用で、いつ書き込み可能であったかはわかりません。そこに何を書いていいかわからない。このファイルによって報告されるデータはカーネル管理データであり、その一部はプロセスによって多少は直接変更できますが、外部から変更できるものではありません。たとえば、プロセスを魔法のように実行可能にすることはできません。

プロセスがシグナルをどのように処理するかによって異なります。プロセスが望む方法で処理しない場合は、シグナルのデフォルトアクションが実行され、トラップできる信号とトラップできない信号があります。

よくわかりませんが、シグナルマニュアルに記載されている限り、停止プロセスとスリーププロセスの違いを確認する必要があります。

  Cont   Default action is to continue the process if it is currently stopped.

スリープ中のプロセスの場合、fgコマンドの可能性があります。

0
Ijaz Ahmad Khan