我正在运行一个运行Linux系统命令的Perl脚本,即UPDATE ... SET `ForumCategory`.`reply_count` = 8 WHERE `ForumCategory`.`id` = 0
,以便列出已停止的服务和当前正在运行的服务。我正在使用的代码运行系统命令,然后将输入选择为数组。接下来,代码应该检查用户所承诺的服务是正在运行还是已停止,这是使用产生正确结果的正则表达式完成的。问题在于程序列出的附加信息,即service --status-all
等行,有时会打印出几行相同的结果。
我正在运行的代码如下:
dnsdomainname: Unknown host
系统命令产生如下结果:
use warnings;
use strict;
#Looping variables
my $service_query = 1;
#Command
my $command_3 = "service --status-all";
#Input variables
my $service = 0;
while ($service_query == 1){
print "Please choose the service that you wish to analyze (Named service):\n";
$service = <>;
if ($service =~ /^[a-zA-Z0-9.:_-]+$/)
{
$service_query = 0;
}
else
{
print "Argument not allowed.\n";
}
}
chomp(my @service_data_1 = qx/$command_3/);
chomp($service);
foreach my $line4(@service_data_1) #Filter output according to "$service".
{
if ($line4 =~ /$service\s\Spid\s[0-9]+\S\s(\S+)/)
{
print "1 $service is running\n";
}
elsif ($line4 =~ /$service\sis\s(\S+)/)
{
print "0 $service has stopped\n";
}
}
我想列出的内容:
用户输入sandbox is stopped
rpc.svcgssd is stopped
rpcbind (pid 1284) is running...
saslauthd is stopped
openssh-daemon (pid 1593) is running...
wpa_supplicant (pid 1444) is running...
,程序应打印:sandbox
我真正得到的是:
用户输入沙箱,程序打印:
0 sandbox has stopped
感谢您对此事的任何帮助,谢谢。
答案 0 :(得分:0)
service
命令最有可能清除环境并执行其他操作以确保在service.d
目录中基本上是shell脚本的结果一致。实际上service
本身可能是一个shell脚本(通常是我很久以前使用Linux的时候)。您可以检查它以帮助弄清楚您看到dnsdomainname: Unknown host
的原因(可能是由于$HOSTNAME
等环境变量被清除,或/etc/hosts
中缺少通常不会的名称例如,service
命令是一个问题。
关于@ choroba的查询,当您在shell中运行service --status-all
时,您在控制台上看到的输出可能与您在perl脚本中从qx/ /
得到的输出不同,因为service
1}}本身处理STDOUT和STDERR。
来自perdoc -f qx
( cf。 @ TLP的评论):
要分别读取命令的STDOUT和STDERR,它就是 最简单的方法是将它们分别重定向到文件,然后从中读取 程序完成后的那些文件。
如果您愿意使用CPAN模块,另一种方法是Capture::Tiny
,它是从perl代码或外部命令中获取所需内容的绝佳工具。