56182


`ps` コマンドなどを実行すると、ある時刻の特定のプロセスに、何の pid が割り振られているかを確認することができます。

別の時刻にもう一回 `ps` を実行すると、先ほど確認した pid を持つプロセスがあるかどうかを確認することができますが、 linux/unix では
pid が使い回されることを考えると、この、別の時刻において取得された pid
に紐づいたプロセスは、必ずしも前に取得した際のプロセスとは同一ではないと思っています。

たとえば、 pid を記録しておいて、のちのちにプロセス制御でその pid
を利用する場合に、万が一、再利用によって別プロセスになっていた場合に、事故のようなことが起きたら嫌だな、と考えると、以下の疑問が生じました。

### 質問

ある別々の時刻で特定の pid に対応するプロセスを取得したときに、これらが同一のものであるかを確認するための手段はありますか？


CC BY-SA 4.0
2019-06-28T07:19:37.003
56177
2020-05-16T07:51:32.537
2020-04-14T15:56:03.067
754
754
question
linux unix
ある時刻の、特定の pid のプロセスと、別の時刻における同じ pid のプロセスの同一性の判定はできる？


`/proc/`ディレクトリ以下に実行中のPIDごとの情報があるので、これらが利用出来そうです。  
活用しやすそうなものを挙げると、

[code]

    /proc/<PID>/cmdline   起動したプログラムとその引数
    /proc/<PID>/exe       起動したプログラムへのシンボリックリンク
    
[/code]

参考:  
[/proc/プロセスID を探検する - いますぐ実践! Linuxシステム管理 /
Vol.024](http://www.usupi.org/sysad/024.html)


CC BY-SA 4.0
2019-06-28T07:30:18.133
56178
2019-06-28T07:30:18.133
3060
56177
answer


この記事だと、PIDと開始時間を組み合わせるのが良い、という意見ですね。  
[Uniquely identifying processes in
Linux](http://benno.id.au/blog/2015/06/28/identifying-linux-processes)

> Thankfully, the kernel associates another useful piece of information with a
> process: it’s start time. The combination of PID and start time provides a
> reasonably robust way of uniquely identifying processes over the life-time
> of a system. (For the pedantic, if a process can be created and correctly
> reaped all within the granularity of the clock, then it would be
> theoretically possible for multiple different processes to have existed in
> the system that have the same PID and start time, but that is unlikely to be
> a problem in practise.)
>
>
> ありがたいことに、カーネルは別の有用な情報をプロセスに関連付けます。それは開始時間です。PIDと開始時間の組み合わせは、システムの存続期間にわたってプロセスを一意に識別する合理的で堅牢な方法を提供します。（理論的には、プロセスが作成され、クロックの精度ですべて正しく処理されるのであれば、同じPIDと開始時間を持つ複数の異なるプロセスがシステムに存在することは理論的には可能です。実際には問題になる可能性は低いです。）

UIDとかも含めれば比較が簡単で良いかも。  
@cubickさんの示したプログラムと引数も単純な文字列比較で、割と厳密に出来そうですね。  
[3\. ps コマンドからわかる事](https://kazmax.zpp.jp/linux_beginner/process_ps.html#an3)  
[標準フォーマット指定子](https://kazmax.zpp.jp/cmd/p/ps.1.html#ah_15)

最初に、時間にあたりを付けて検索した記事が以下になります。  
[Linuxプロセスの起動時刻を調べる方法](https://qiita.com/isaoshimizu/items/ee555b99582f251bd295)  
[How to get the start time of a long-running Linux
process?](https://stackoverflow.com/q/5731234/9014308)  
[How to get the process start date and
time](https://linuxcommando.blogspot.com/2008/09/how-to-get-process-start-
date-and-time.html)


CC BY-SA 4.0
2019-06-28T08:06:41.280
56182
2019-06-28T08:06:41.280
2020-06-17T08:14:45.997
-1
26370
56177
answer


Linux 5.3+ 限定ですが `pidfd_open`(2) で開いて監視しておけば OK かと。

もしくはこれも Linux 限定だと思いますが `/proc/<PID>` に `chdir`(2) (`cd`) しておいて `.`
が存在するかをポーリングで確認。該当プロセスが終了すると `.` には `ENOENT`
でアクセスできなくなります。なお、`inotifywatch`(1) (`inotify`(7)) で `/proc//*
下のファイルへのイベント監視を試してみましたが、有用なイベントを補足できませんでした。

<https://github.com/fumiyas/home-commands/blob/master/pwait>


CC BY-SA 4.0
2020-05-16T07:51:32.537
66666
2020-05-16T07:51:32.537
3061
56177
answer