我有一个小的Perl脚本,用于获取用户命令行输入,然后将输入拆分为一个数组,其中每个服务应该是它自己的元素。
我的目标是使用分割字符启用单个参数以及多个参数,其中每个参数都用逗号分隔。这些例子如下:
我的代码如下所示,它编译时没有错误,但输出不是预期的。
print "Please provide the service name that you wish to analyze (Named service):\n";
print "Several services may be provided, using a comma sign as a separator.\n";
my $service_name_input = <>;
chomp($service_name_input);
my @service_list = split(/,/, $service_name_input);
foreach my $line (@service_list)
{
open(my $service_input, "service @service_list status|");
}
foreach my $line (@service_list)
{
#Matches for "running".
if ($line =~ m/(\(running\))/)
{
print "The service @service_list is running\n";
}
#Matches for "dead".
elsif ($line =~ m/(dead)/)
{
print "The service @service_list is dead\n";
}
}
如果服务正在运行或死机,程序应输出,但我只收到以下错误代码。手动发出服务命令时,它可以正常工作。
service命令仅支持基本的LSB操作(启动,停止, restart,try-restart,reload,force-reload,status)。对于其他 请尝试使用systemctl。
对于我为实现工作计划应采取的步骤提供的任何帮助将不胜感激。谢谢你的阅读。
答案 0 :(得分:2)
foreach my $line (@service_list)
{
open(my $service_input, "service @service_list status|");
}
此循环不使用$line
。您将整个数组@service_list
传递给服务命令,即您正在运行service ssh named cups status
。这会导致错误,因为service
认为您要对named
服务执行ssh
操作。要解决此问题,请写下"service $line status |"
。
但还有另外一个问题:你永远不会对$service_input
做任何事情。如果要遍历每个服务命令输出的每一行,则需要更多类似的内容:
foreach my $service (@service_list)
{
open(my $service_input, '-|', 'service', $service, 'status')
or die "$0: can't run 'service': $!\n";
while (my $line = readline $service_input)
{
#Matches for "running".
if ($line =~ m/(\(running\))/)
{
print "The service $service is running\n";
}
#Matches for "dead".
elsif ($line =~ m/(dead)/)
{
print "The service $service is dead\n";
}
}
}
我已经更改了您的open
行以使用单独的模式参数-|
(这是一般的好样式)和进程打开的列表形式,这避免了shell,这是一般情况也不错(例如,#{1}}中没有与#34;特殊字符&#34相关的问题。