У меня есть 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
Но, похоже, это не имеет значения. Может ли кто-нибудь дать мне какие-либо указания относительно того, почему это происходит и что можно сделать, чтобы разрешить это.
Вам нужно очистить $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
.