以UNIX-y的方式,我正在尝试启动一个进程,对其进行后台处理,并将该进程的生命周期与我的
shell联系起来.
我所说的不仅仅是后台进程,我希望将进程发送到SIGTERM,或者让它有一个关闭的打开文件描述符,或者当shell退出时,以便shell的用户不必显式杀死进程或获得“你有正在运行的作业”警告.
最终,我想要一个程序,它可以为每个shell独特运行,并随着shell运行状态,并在shell关闭时关闭.
IBM的DB2控制台命令以这种方式工作.当您连接到数据库时,它会生成一个“db2bp”进程,该进程包含数据库状态和连接并将其绑定到您的shell.您可以在多个不同的终端或ssh连接中进行连接,每个终端都有自己的db2bp进程,当这些进程关闭时,相应的db2bp进程将终止,并且该连接将关闭.
然后使用db2命令启动DB2查询,该命令只是将其移交给相应的db2bp进程.我不知道它是如何与正确的db2bp进程通信的,但是它可能使用连接到stdin的tty设备作为唯一密钥?我想我也需要解决这个问题.
我从来没有写任何有关操作的东西,所以我不知道哪里可以开始.如果我可以生成一个在shell退出时自动终止的进程,我想我可以解决其余问题.任何人都知道DB2是如何做到的?
如果你的shell不是子shell,你可以做以下事情;将以下内容放入名为“ttywatch”的脚本中:
#!/usr/bin/perl my $p=open(PI,"-|") || exec @ARGV; sleep 5 while(-t); kill 15,$p;
然后运行您的程序:
$ttywatch commandline... & disown
取消该进程将阻止shell抱怨正在运行的进程,并且当终端关闭时,它将导致SIGTERM(15)在5秒内被传递到子进程(您的应用程序).
如果shell不是子shell,你可以使用像ttywrap这样的程序来至少给它自己的tty,然后上面的技巧就可以了.