Как запустить предоставленную пользователем команду в бесконечном цикле в скрипте perl, пока пользователь не прервет ее? - PullRequest
0 голосов
/ 14 сентября 2011

Мне нужно выполнить команду, пока тестируемая система не выйдет из строя или я не прерву выполнение сценария.Команда, которую мне нужно выполнить, может отличаться, поэтому я принимаю ее в качестве аргумента командной строки в кавычках.Но я не могу запустить аргумент командной строки, используя системную команду.Вот что я попробовал до сих пор (отредактировал мою попытку с помощью скрипта, предоставленного @Cfreak, даже когда я вижу ту же проблему):

#!/usr/bin/perl


while(1)
{
    print "Iteration #: $count\n";
    $retval = system ($ARGV[1]);
    if( $retval != 0 ) {
        print "System call $ARGV[1] failed with code $retval\n";
    }
    $count++;
}

Если я это сделаю.Я вижу следующие отпечатки:

System call  failed with code 65280
Iteration #: 1
System call  failed with code 65280
Iteration #: 2

Что я здесь не так делаю?

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Я считаю, что вы хотите $ ARGV [0], а не $ ARGV [1].Вы также можете проверить наличие $ ARGV [0].

if( 0 > $#ARGV )
{
  print "No command\n";
}
else
{
  while(1)
  {
    print "$count\n";
    my $ret = system( "ARGV[0]" );
    if( 0 != $ret )
    {
      print "<$ARGV[0] failed with $ret\n";
      exit;
    }
    $count++;
  }
}
3 голосов
/ 14 сентября 2011

У вас есть одинарные кавычки вокруг вашего аргумента system.Вам вообще не нужны кавычки (хотя сработали бы двойные кавычки)

На самом деле вам также следует проверить возвращаемое значение системного вызова.В случае успешного вызова он должен вернуть 0:

while(1)
{
    print "Iteration #: $count\n";
    $retval = system ($ARGV[1]);
    if( $retval != 0 ) {
         print "System call $ARGV[1] failed with code $retval\n";
    }
    $count++;
}

Если вы хотите остановить сценарий, когда код не выполняется, просто используйте last:

while(1)
{
    print "Iteration #: $count\n";
    $retval = system ($ARGV[1]);
    if( $retval != 0 ) {
         print "System call $ARGV[1] failed with code $retval\n";
         last; # will break out of the loop
    }
    $count++;
}
2 голосов
/ 14 сентября 2011

65280 == 0xFF00, поэтому команда выполнила (0xFF00! = -1), она не умерла от сигнала (0xFF00 & 0x7F == 0) и вышла с кодом выхода 255 (0xFF00 >> 8 == 0xFF == 255).

Так что, я думаю, вы должны начать с проверки, какую команду вы выполняли.Ну, согласно вашему собственному выводу, пустая строка!Возможно, вы хотите $ARGV[0] вместо $ARGV[1]?

Используйте use strict; use warnings; !!!Он бы избежал всей этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...