プロセスが存在し、どのLinuxでも実行されているかどうかを確認する最も普遍的な方法を見つけたいと思います。マックOS Xがある場合、私はkqueue感謝を経由して、これを行うために利用可能な思いのUnix/BSDでは/proc/[pid]/statは、すべてのlinuxディストリビューションで常に利用できますか?
EVFILT_PROC/NOTE_EXIT
を使用してsyscall.Kqueue()
にそれは問題では、NetBSDの、FreeBSDでは、などのコードはうまく動作し、監視するのに役立ちますしません。 PIDの状態。 Linux上で同じことを達成しようとし
は、私がここで提案のようにkill -s 0
、代わりに信号0を送信する、/proc/[pid]/stat
ファイルの存在を定期的にチェックするためにアイデアを来た:https://stackoverflow.com/a/15210305/1135424主に非そのためのロジックを簡素化します既存のプロセスに対して-nilエラーが返される可能性があります。
おそらくのようなもの使用:
initialStat, err := os.Stat(fmt.Sprintf("/proc/%d/stat", self.pid)
if err != nil {
return
}
for {
stat, err := os.Stat(fmt.Sprintf("/proc/%d/stat", self.pid)
if err != nil {
return err
}
if stat.Size() != initialStat.Size() || stat.ModTime() != initialStat.ModTime() {
return nil
}
// wondering how to avoid sleeping here
time.Sleep(time.Second)
}
をしかし、すべてのLinuxに/proc/[pid]/stat
は、基本的にはまったく同じことをやっている信号0 kill -0 $PID
を送信することにより、常に利用可能か場合であれば不思議。
私はいつもkill -O $PID
にフォールバックすることができますが、主に多くのCPUリソースを消費しないために、ループでスリープ状態にならないようにするために、使用可能な可能性のあるソリューション(おそらくinotify)