Exec возвращает больше, чем ожидалось

1

У меня есть php-скрипт, который запускается через работу cron.

У меня есть команда exec в скрипте:

exec("ps -u bob -o user:20,%cpu,cmd | awk 'NR>1' | grep vlc | tr -s ' ' | cut -d ' ' -f 2",$cpu,$return)

Это приводит к тому, что процессор создает процесс, выполняемый конкретным пользователем, если этот процесс существует. При запуске через командную строку я получаю сообщение 21 или ничего вообще не зависит от того, запущен ли процесс или нет. Однако при запуске vai скрипт PHP я получаю следующее:

[0] => bob 0.0 /bin/sh -c php /home/bob/restart.php bob
[1] => bob 0.0 php /home/bob/restartStream.php bob
[2] => bob 0.0 sh -c ps -u bob -o user:20,%cpu,cmd | awk NR

Кажется, он возвращает все последние выполненные команды, а не результат выполнения команды.

Я видел несколько сообщений, в которых показано использование 2>&1 которое, я считаю, перенаправляет stdin и stdout или подобное. Однако я пробовал это в своей команде так:

ps -u bob -o user:20,%cpu,cmd | awk 'NR>1' | grep vlc | tr -s ' ' | cut -d ' ' -f 2 2>&1

Но, похоже, это не имеет значения. Может ли кто-нибудь дать мне какие-либо указания относительно того, почему это происходит и что можно сделать, чтобы разрешить это.

Теги:
exec

1 ответ

1
Лучший ответ

Вам нужно очистить $cpu перед вызовом exec. Он добавляет новый вывод в конец массива, он не перезаписывает его.

Вы также можете избавиться от grep, tr и cut и выполнить всю обработку вывода в awk

$cpu = array();
exec("ps -u bob -o user:20,%cpu,cmd | awk 'NR>1 && /vlc/ && !/awk/ {print $2}'",$cpu,$return);

Параметр !/awk/ позволяет совместить строку awk, так как содержит vlc.

  • 0
    Я только начал возиться с трубами, резкой и т. Д., И ваше решение легко изменить и работает потрясающе. Действительно большое спасибо за помощь, это высоко ценится. Похоже, я немного читаю на awk.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню