首页 文章

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

提问于
浏览
2

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

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

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

我排除了PID和PID tty . 什么是好的将是一种查询进程开始日期/时间的方法,所以我的唯一ID将是PID tty开始日期/时间...

任何想法都感激不尽!

1 回答

  • 2

    独特文件

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

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

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

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

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

    独特的会话

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

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

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

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

相关问题