POSIX或者Linux获取shell进程的唯一ID的方式

我正在编写一个简单的命令行实用程序,并希望能够获得父进程(即运行该命令的shell)的某种全局唯一标识符。

PID对我来说是不够的,因为随着时间的推移,有两个PID值会碰撞的可能性。

我的用例如下:我想存储运行命令行实用程序的“会话”数据,该实用程序在同一个shell进程中运行的实用程序的所有实例中保留。 我不希望这个数据与其他shell实例共享。 我想要某种标识符,使我能够执行这种关联,而不会发生碰撞。

我排除了PID和PID + tty。 什么会是很好的方式来查询过程的开始date/时间,所以我的唯一ID将PID + tty +开始date/时间…

任何想法感激地接受!

独特的文件

我建议使用基于文件的方法。 独特的文件,特别是独特的临时文件,在许多情况下都是需要的,所以你可以使用一个工具来完成这个目的,mktemp:

 $ mktemp -t identifier.XXXXXXXXXX /tmp/identifier.yaJMl0cBnK 

如果你在父shell中执行这个命令,你会得到一个新创建的文件的名字,这个文件是以保证唯一的方式创建的。 正如你所看到的,X的后缀(至少3)被随机内容替换,所以如果目标文件已经被使用,mktemp有很多机会来创建一个替代。

为了避免污染,请确保您的父shell在工作完成后删除文件。

现在您可以将日期/时间写入文件或调整标识符部分。 这真的取决于你更喜欢什么。

独特的会议

正如在评论中指出的那样,创建临时文件并不总是需要的。 实际上,mktemp的使用不能被认为是符合POSIX的,因为mktemp(1)没有被标准覆盖。

另一种方法是利用“会话ID”(技术上正确:“会话负责人的进程ID”)。 这个问题明确指出父进程是一个shell。 壳成为会议的领导者,以管理他们的过程组。 你可以通过调用ps来使用-o会话来看到会话ID,例如ps -o pid,session,cmd

只要至少有一个进程仍在该会话中,会话标识就会保留。 您可以安全地假定会话ID对于您的程序组是唯一的,并且在系统上是唯一的。 如果父shell终止,也是如此。 你的节目变成孤儿,但仍然在他们的会议。 如果最后一个程序终止,会话将被销毁(并释放会话ID)。

在C / C ++中,可以通过调用POSIX所涵盖的getsid(0)来检索进程的会话标识。