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

以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,然后上面的技巧就可以了.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...