gpt4 book ai didi

perl fork 远程运行时无法正常工作(通过 ssh)

转载 作者:行者123 更新时间:2023-12-04 16:41:33 25 4
gpt4 key购买 nike

我有一个 perl 脚本 script.pl ,它在运行时会执行 fork ,父进程将其 pid 输出到文件然后退出,而子进程将某些内容输出到 STOUT,然后进入 while 循环。

$pid = fork();

if ( ! defined $pid )
{
die "Failed to fork.";
}
#Parent process
elsif($pid)
{
if(!open (PID, ">>running_PIDs"))
{
warn "Error opening file to append PID";
}
print PID "$pid \n";
close PID;
}
#child process
else
{
print "Output started";

while($loopControl)
{
#Do some stuff
}
}

当我在本地调用它时,这很好用,即:perl script.pl。

该脚本打印出一些内容,然后将控制权返回给 shell。 (而子进程在后台进入其循环)。

但是,当我通过 ssh 调用它时,控制永远不会返回到 shell(也不会打印“输出开始”行。

IE:
$ ssh username@example.com 'perl script.pl'

然而,有趣的是,子进程确实运行了(我可以在输入 ps 时看到它)。

谁能解释发生了什么?

编辑:

我在调试下运行它并得到了这个:

### forked,但不知道如何创建新的 TTY。

由于两个调试器争夺同一个 TTY,输入被严重纠缠。

我知道如何在 xterms 中将输出切换到不同的窗口
和 OS/2 控制台。对于手动切换,输入创建的 TTY 的名称
在 $DB::fork_TTY 中,或者定义一个函数 DB::get_fork_TTY() 返回这个。

在类 UNIX 系统上,可以获取给定窗口的 TTY 名称
通过键入 tty,然后通过 sleep 1000000 断开 shell 与 TTY 的连接。

最佳答案

每当您通过非交互式 ssh 命令启动后台作业时,您都需要关闭或以其他方式绑定(bind) stdin、stdout 和 stderr。否则 ssh 将等待后台进程退出。 FAQ .

这称为与控制终端解除关联或分离,这是编写后台作业时的一般最佳实践,而不仅仅是 SSH。

因此,不会使整个命令静音的最简单更改是添加:

#close std fds inherited from parent
close STDIN;
close STDOUT;
close STDERR;

在您的 print "Output started"; 之后.如果您的子进程需要在运行期间定期打印输出,那么您需要重定向到日志文件。

关于perl fork 远程运行时无法正常工作(通过 ssh),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com