2015-06-02 4 views
0

Я пытаюсь прочитать счетчики производительности и получить IPC. Мне нужно использовать IPC для управления несколькими параметрами машины. Я использую сценарий оболочки, чтобы сделать то же самое. Пожалуйста, смотрите код ниже:Передача IPC (Инструкции/Циклы) непрерывно к другой функции или переменной

while true 
do 
    retval=./perf periodic -e instructions -e cycles -s 50 -d -m td & 
    some_pid=$! 
    kill some_pid 
    if ["$retval" -gt "0.5"] 
     then 
      ***something*** 
    fi 
    sleep 1 
done 

я получаю следующее сообщение об ошибке:

Algorithm.sh[27]: kill: some_pid: arguments must be jobs or process IDs 
Algorithm.sh[27]: periodic: not found 
Algorithm.sh[27]: [: missing ] 
Algorithm.sh[27]: kill: some_pid: arguments must be jobs or process IDs 
Algorithm.sh[27]: [: missing ] 
Algorithm.sh[27]: periodic: not found 
Algorithm.sh[27]: kill: some_pid: arguments must be jobs or process IDs 
Algorithm.sh[27]: [: missing ] 

Может кто-нибудь дать мне несколько советов о том, как получить/вернуть значение из инструкции перфорации. Я пробовал использовать функцию и возвращал значение, но также не удалось.

--------- ОБНОВЛЕНО ----------

Теперь я бегу следующий, и одна из проблем был решен, а один остается.

./perf periodic -e instructions -e cycles -s 50 -d -m td > result.txt & 

И другая является

while true 
do 
    retval=$(tail -n 1 result.txt) 
    echo $retval 
    if ["$retval" -gt "0.5"] 
     then 
      echo "Hello mate" 
    fi 
    sleep 1 
done 

эхо дает значение, но затем, если оператор не получает казнены. Он дает следующие сведения:

Algorithm.sh[30]: [: missing ] 
0.302430 
Algorithm.sh[30]: [0.302430: not found 
0.472716 
Algorithm.sh[30]: [0.472716: not found 
0.475687 
Algorithm.sh[30]: [0.475687: not found 

Я искал синтаксис условия if и не смог обнаружить ошибку. Пожалуйста помоги.

ответ

1

Пара проблем с синтаксисом оболочки здесь.

Во-первых, retval=... будет устанавливать переменную retval, равную первой части строки в правой части '='. Затем амперсанд будет освещать все это, по сути, отбрасывая это значение. Вы, вероятно, имел в виду сделать:

retval=`./perf periodic -e instructions -e cycles -s 50 -d -m td` 

, который будет хранить вывод команды perf в retval. Однако это не сработает, если вы поместите его в фоновом режиме с помощью «&». Вам нужно либо (a) запустить его синхронно без «&», как я показал выше, (b) перенаправить свой вывод в файл и восстановить его после его завершения (вам нужно будет использовать wait, чтобы определить, когда это произошло), или (c) использовать «сопроцесс» (слишком сложный для объяснения здесь: см. страницу руководства bash).

Кроме того, вы, вероятно, имели в виду kill $some_pid? Без «$» строка "some_pid" передается как литерал аргумент kill, что, вероятно, не так, как вы планировали.

Редактировать

После ваших изменений ... Оболочка работает путем разделения командной строки на отдельные лексемы. Таким образом, места часто важны. В этом случае начальный токен, идентифицируемый оболочкой, будет комбинированным значением ["$retval" (после замены переменной замены и цитаты). Последний токен будет 0.5] после удаления котировок. В первой строке вызова первый токен был просто «[» (предположительно, retval был пуст в первый раз). Таким образом, он жалуется, что последний токен не соответствует совпадению ']'. В других итерациях первый токен равен «[плюс плюс числовой текст от $retval), который не содержит допустимого имени команды.

Как только вы исправите это, вы обнаружите, что оператор -gt оценивает только целые сравнения. Вы можете использовать команду bc(1). Например, эта команда будет выдавать вывод 1, если $retval больше 0,5; в противном случае 0.

echo "$retval > 0.5" | bc 

Но обратите внимание, вам необходимо обеспечить retval имеет допустимое числовое выражение или вы будете вызывать ошибку синтаксиса в bc. Затем вам нужно будет захватить вывод и поставить его в условное. Что-то, как это должно работать:.

if [ "$retval" ] 
then 
    x=$(echo "$retval > 0.5" | bc) 
    if [ $x -eq 1 ] 
    then 
     echo "hello mate" 
    fi 
fi 

(Обратите внимание, что с $(...) вы не нужны дополнительные помещения рядом с круглыми скобками и в операторе присваивания x=foo, вы должны не имеют место по обе стороны =.)

+0

Я обновил вопрос с внесенными вами изменениями. И теперь у меня проблема в выражении «if». – shingaridavesh