Странный вывод при печати возврата grep -c - PullRequest
0 голосов
/ 24 октября 2018

Ниже приведена программа-оболочка, только я тестирую, как определить, работает ли тот же самый Perl-скрипт с теми же параметрами.

Это работает, но то, что кажется мне странным, это конечный ноль послеколичество строкЯ не вижу, где в моем коде будет напечатан этот ноль.Если я запускаю эту команду grep из командной строки, она просто возвращает счетчик, не заканчивая '0', но в коде это не работает.

Есть кто-нибудь подсказки?

Спасибо

Приложение

#!/usr/bin/perl

use CGI;
$|=1;

my $q = CGI->new();
my $userid = $q->param("u");
my $check = "'perly.pl u=" . $userid . "'";

my $return= system("ps aux | grep $check | grep -v 'grep' -c");

print $return;
print "\n";

while(1)
{
        print "$userid...";
        sleep(3);
}

exit 0;

Выход

2 0 PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer..PlasticProgrammer ..

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Если кто-то ищет решение этой проблемы, хорошие идеи, но в конце концов я решил создать уникальный временный файл и направить вывод в этот файл.

Во многих случаях я нашел этотот, который чувствовал себя хорошо для меня.

#!/usr/bin/perl

use CGI;
use File::Temp;
$|=1;

my $q = CGI->new();
my $userid = $q->param("u");
my $check = "'perly.pl u=" . $userid . "'";

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); 
$year += 1900;
$mon++;

my $uFile = $userid . $year . $mon . $mday . $hour . $min . $sec . ".dat";

my $command = "ps aux | grep $check | grep -v 'grep' -c > $uFile";

system($command);

if (open(my $fh, "$uFile"))
{
    while (my $line = <$fh>)
    {
        if($line>1)
        {
            print"\nApp is already running";
         }
    }

    close($fh);
    unlink($uFile);
}
exit 0;
0 голосов
/ 24 октября 2018

Вы можете легко зафиксировать выходной и выходной значения команды, используя Capture :: Tiny .Кроме того, при использовании встроенной системы всегда проверяйте, успешно ли выполнено выполнение, если это не удалось, это указывается возвращаемым значением -1.

use strict;
use warnings;
use Capture::Tiny 'capture_stdout';

my $check = "perly.pl u=foo";
my ($stdout, $exit) = capture_stdout { system 'pgrep', '-fc', $check };
die "pgrep failed: $!" if $exit == -1;

Помнитечто ваш вывод, скорее всего, закончится новой строкой, даже просто счетчиком, так что вы, вероятно, захотите chomp it.

Вы также можете использовать оператор backticks / qx * ​​1013* чтобы вернуть только STDOUT, но это всегда будет передавать команду через оболочку, требуя от вас использовать String :: ShellQuote для аргумента, содержащего пользовательский ввод, как отмечено @ ikegami.

use strict;
use warnings;
use String::ShellQuote;

my $check = shell_quote "perly.pl u=foo";
my $stdout = `pgrep -fc $check`;
die "pgrep failed: $!" if $? == -1;

Альтернативой является IPC :: System :: Simple , которая предоставляет capturex, форму оператора обратных ссылок, которая принимает список аргументов, подобных system, и никогда не пропускает их через оболочку.По умолчанию он генерирует исключение в случае сбоя команды или при наличии ненулевого кода выхода, но вы можете указать, чтобы разрешить определенные коды выхода.Поскольку pgrep возвращает ненулевой код выхода, если совпадений нет, вы хотите разрешить ненулевые коды выхода.

use strict;
use warnings;
use IPC::System::Simple qw(capturex EXIT_ANY $EXITVAL);

my $check = "perly.pl u=foo";
my $stdout = capturex EXIT_ANY, 'pgrep', '-fc', $check;
my $exit = $EXITVAL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...