我正在使用 ssh 在另一台机器上运行一台机器上的脚本。
ssh <host> a.pl
现在,a.pl 使用“系统”方法启动了 a.pl 的几个其他实例,并在后台执行每个实例。我已将其与 LDAP 集成,当其中一个实例死亡时,主 a.pl 脚本会知道这一点,因为它会持续监控它们。因此,在发现其中一个实例死亡后,主脚本也会死亡,其余实例则由 init (1) 拥有。
我希望 ssh 在这个主脚本终止时退出。但是,不知何故,ssh 似乎一直在等待所有已启动的进程。当我终止剩余实例时,ssh 退出。
这是预期的行为吗?如果是,为什么会这样?
答案1
是的。这是预期的行为。您不希望已注销用户的进程在您的系统上徘徊。对于此用例,有服务。
从内部来看,这基本上是由于 ssh 正在等待执行的进程关闭文件句柄(stdin、stdout、stderr)的时间,这些句柄会被重定向到客户端。通过运行其他脚本,它们将继承相同的文件句柄,因此它们不会在所有子脚本完全关闭之前完全关闭。