我使用System()从另一个派遣一个perl脚本,我希望这些脚本具有通信(握手的机制),其中基于一个脚本的输出,我可以执行在另一个中进一步处理。
请看一下:
可以说我在Main.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Net::OpenSSH;
6
7 #check for if the socket is established
8 #call the client (host) script
9 my $pwd = $ENV{'PWD'};
10 my $rc = system("$pwd/utpsm_run_automation/utpsm_lts_client.pl")
11 or die "cant run client.pl $! n";
在我正在调用的上面脚本中,我想看看是否建立了与服务器的连接,因此我需要的某些握手机制,基本上是在Main.pl中进行进一步处理。在运行后的脚本上方。我现在清除了吗?
这是client.pl
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use IO::Socket::INET;
5 use Net::OpenSSH;
6 #auto-flush on socket
7 $| = 1;
8
9 #create a connecting socket
10 my $socket = new IO::Socket::INET (
11 PeerHost => 'ltsbm.aus.XX.XX',
12 PeerPort => 7777,
13 Proto => 'tcp',
14 );
15 die "cannot connect to the server$! n" unless $socket;
16 print "VIRU ::connected to the server n";
17
18 #data to send to the server
19 my $req = 'VIRU :: Sending data n';
20 sleep(20);
21 my $size = $socket->send($req);
22
23 #sending file over socket using scp
这是client.pl
我同意以前的评论者,首先,总体想法不是很好。谁想出了该体系结构的要求,可能会知道一些外壳脚本,但不知道perl。
也就是说,如果您确定您的输出不是很长,并且只有在子进程完成时才可以处理它, @xxfelixxx使用qx//
的想法绝对是最简单的。如果您想在孩子仍在运行时处理输出,并且/或输出可能很大,以至于最好按线进行处理,则可以轻松地在open()
调用中设置管道:
open my $pipe, '-|', $program_name or die "Could not run $program_name: $!';
while(<$pipe>) {
... # read process output
}
比设置命名管道并进行fork()/exec()
舞蹈的简单任务要容易得多,并且容易发生。
我假设您已经有一个client.pl的结果列表。为您的参考创建返回代码表,以供客户端脚本的每个可能结果,例如:
0 = success connecting to server
1 = unable to ping remote server
2 = socket error
在客户端脚本完成之前,请使用返回代码退出。示例:
exit 1;
现在有主脚本捕获返回代码&amp;通过if语句解析。主脚本可以根据返回的返回代码来采取措施。