何年も前に、Linuxでプロセスがランダムにスリープ状態になる問題がありました。その当時、私は/proc
ファイルシステムでプロセスのウェイクアップをトリガーするトリックを知っていました。 "echo R" >/proc/pid/stat
のようなことができることを漠然と覚えていますが、それは適切なコマンドではないようです。
「眠っているプロセスを起こすにはどうすればよいですか」というインターネット上のヒットはたくさんあります。そして答えの多くは「ああ、ただ殺せ!」別の方法があることは知っていますが、私の記憶は今私を失敗させています。
これまでのところ、私は試しました:
kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
「眠る」とはどういう意味ですか?
状態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
コマンドの可能性があります。