【发布时间】:2011-03-07 00:58:51
【问题描述】:
我有一个 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(也不会打印“输出开始”行。
即: $ ssh username@example.com 'perl script.pl'
然而,有趣的是,子进程确实在运行(我可以在输入 ps 时看到它)。
谁能解释这是怎么回事?
编辑:
我在调试下运行它并得到了这个:
### forked,但不知道如何创建新的 TTY。由于两个调试器争夺同一个 TTY,输入严重纠缠。
我知道如何在 xterms 中将输出切换到不同的窗口 和 OS/2 控制台。对于手动切换,输入创建的 TTY 的名称 在 $DB::fork_TTY 中,或者定义一个返回 this 的函数 DB::get_fork_TTY()。
在类 UNIX 系统上,可以获取给定窗口的 TTY 名称 通过键入 tty,然后通过 sleep 1000000 断开 shell 与 TTY 的连接。
【问题讨论】:
-
如果除了
screen(我并不总是有)之外,还有其他人对此问题有解决方案,我很乐意看到它。