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

时间:2015-04-17 17:35:37

标签: linux shell command-line persistence posix

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

PID对我来说还不够,因为随着时间的推移,两个PID值可能会发生冲突。

我的用例如下:我想存储"会话"运行命令行实用程序的数据,该实用程序在同一shell进程中运行的实用程序的所有实例中持续存在。我不希望这些数据与其他shell实例共享。我想要某种标识符,这将允许我执行该关联,而不会发生冲突。

我排除了PID和PID + tty。最好的方法是查询流程开始日期/时间,这样我的唯一ID就是PID + tty +开始日期/时间......

感激地接受任何想法!

1 个答案:

答案 0 :(得分:2)

唯一文件

我建议使用基于文件的方法。在许多情况下需要独特的文件,尤其是独特的临时文件,因此您可以使用工具来实现此目的,mktemp:

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

如果在父shell中执行此命令,您将获得以保证唯一方式创建的新创建文件的名称。如您所见,X'(至少3)的后缀被随机内容替换,因此如果目标文件已被使用,mktemp有很多机会创建替代。

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

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

唯一会话

正如评论中所述,并不总是需要创建临时文件。事实上,mktemp的使用不能被认为是POSIX兼容的,因为实用程序mktemp(1)不在标准中。

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

只要至少有一个进程仍在该会话中,会话ID就会保留。您可以放心地假设会话ID对于您的程序组是唯一的,并且在您的系统上是唯一的。如果父shell终止,也是如此。您的程序成为孤儿,但仍留在会话中。如果最后一个程序终止,会话仅被销毁(会话ID被释放)。

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