将进程的生命周期与启动它的shell联系起来

Kyr*_*ren 8 unix db2 shell terminal process

以UNIX-y的方式,我正在尝试启动一个进程,对其进行后台处理,并将该进程的生命周期与我的shell联系起来.

我说的是不是简单地backgrounding的过程中,我想的过程要发送SIGTERM,或者它有一个开放的文件描述符被关闭,或者什么时候shell退出,从而使外壳的用户不必显式杀死进程或获得"你有正在运行的作业"警告.

最终,我想要一个程序,可以为每个shell运行唯一的,并且与shell一起携带状态,并在shell关闭时关闭.

IBM的DB2控制台命令以这种方式工作.当您连接到数据库时,它会生成一个"db2bp"进程,该进程包含数据库状态和连接并将其绑定到您的shell.您可以连接多个不同的终端或ssh连接,每个都有自己的db2bp进程,当这些进程关闭时,相应的db2bp进程将终止,并且该连接将关闭.

然后使用db2命令启动DB2查询,该命令只是将其移交给相应的db2bp进程.我不知道它是如何与正确的 db2bp进程通信的,但是它可能使用连接到stdin的tty设备作为唯一密钥?我想我也需要弄明白.

我从来没有写任何有关操作的东西,所以我不知道哪里可以开始.如果我可以生成一个在shell退出时自动终止的进程,我想我可以解决剩下的问题.任何人都知道DB2是如何做到的?

geo*_*car 2

如果您的 shell 不是子 shell,您可以执行以下操作;将以下内容放入名为“ttywatch”的脚本中:

#!/usr/bin/perl
my $p=open(PI, "-|") || exec @ARGV; sleep 5 while(-t); kill 15,$p;
Run Code Online (Sandbox Code Playgroud)

然后运行你的程序:

$ ttywatch commandline... & disown
Run Code Online (Sandbox Code Playgroud)

否认该进程将防止 shell 抱怨有正在运行的进程,并且当终端关闭时,它将导致 SIGTERM ( 15) 在 5 秒内传递到子进程(您的应用程序)。

如果 shell 不是子 shell,您可以使用像ttywrap这样的程序至少给它自己的 tty,然后上面的技巧就会起作用。