问题陈述 -
我使用Perl向用户显示一条消息并接受输入。在输入的基础上,我决定是否需要进行进一步的处理。这个处理需要很长时间(比如5小时),用户运行这个过程登录远程Unix / Linux系统。确保网络故障不会影响进程;我想将流程切换到后台。
如何将此类正在运行的Perl进程切换到后台?
或
如果进程正在运行到后台,是否可以从当前终端(用户运行进程的终端作为输入需要在非常启动时)获取用户输入?
操作系统 - Linux变种
答案 0 :(得分:4)
是的,您希望在完成与用户的交互后对程序进行守护程序。我鼓励你使用像Proc::Daemon
这样的模块来完成这项工作:正确地做这件事有很多细微之处。 POD for Proc::Daemon
很好地描述了它的用法,但简单的用法可以像
use Proc::Daemon;
# ... finished the interactive stuff
my $pid = Proc::Daemon::Init( { work_dir => '/var/run/my_program' })
exit 0 if ($pid == 0);
die "Error daemonizing, cannot continue: $!\n" if ($! != 0);
# ... now do the background processing
# note that STDOUT and STDERR are no longer connected to the user's terminal!
答案 1 :(得分:2)
如果输入正确,请证明该过程:
#test input
if($inputsuccess) {
if(fork() = 0) {
#child
if(fork() = 0) {
#child
#background processing
}
} else {
wait();
}
}
答案 2 :(得分:2)
以上是我上述评论的一个非常非常简单的例子......
#!/usr/bin/perl
use strict;
use warnings;
my $lcnt = 0;
if( !$ARGV[0] ) { # If no ARGS on the command line, get user input
print "How many lines do you want to print?";
chomp( $lcnt = <STDIN> );
if( $lcnt > 0 ) {
# when we are sure we have what we need
# call myself.pl and put it in the background with '&'
my $cmd = "./myself.pl ".$lcnt.' &';
system($cmd);
exit(0);
} else { die "Invalid input!\n"; }
} else { # Otherwise, lets do the processing
$lcnt = $ARGV[0];
for( my $x = 0; $x <= $lcnt; $x++ ) {
my $cmd = "echo 'Printing line: $lcnt' >> /tmp/myself.txt";
system($cmd);
sleep(1);
}
}
exit(0);
如果将其保存到名为“my.pl”的文件中,则运行它。如果命令行没有参数,脚本将要求您输入一个数字。输入20并按Enter键。您几乎可以立即看到脚本退出。但如果你很快
tail -f /tmp/myself.txt
您将看到后台进程仍在运行,每秒都会在文件中打印一个新行。此外,在Linux系统上键入“ps”命令,应该显示在后台运行的衍生进程:
jlb@linux-f7r2:~/test> ps
PID TTY TIME CMD
1243 pts/1 00:00:00 bash
4171 pts/1 00:00:00 myself.pl
4176 pts/1 00:00:00 ps