Завершение бесконечного цикла с помощью конвейерной команды в области видимости - PullRequest
3 голосов
/ 05 мая 2011

У меня есть очень простой сценарий Unix Bash, который я использую для выполнения команды каждую секунду.Он имеет следующую форму:

while : ; do
  cat /proc/`pidof iBrowser.bin`/smaps | awk -f ./myawkscript.awk >> $DIRPATH
  sleep 1
done

Скрипт работает нормально, но не остановится!Если я нажимаю ctrl-C во время работы скрипта, процесс не останавливается, и я получаю следующую ошибку:

cat: не могу открыть '/ proc // smaps': нет такогофайл или каталог

Кто-нибудь знает, как этого можно избежать?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Вы должны рассмотреть функцию ловушки.См. this и this .

Чтобы перехватить ctrl-c, вы должны определить обработчик, например:

ctrl_c ()
{
    # Handler for Control + C Trap
    echo ""
    echo "Control + C Caught..."
    exit
}

И затем указатьчто вы хотите перехватить его с помощью этого обработчика:

trap ctrl_c SIGINT

В качестве альтернативы ...

вы можете запустить скрипт в фоновом режиме, добавив &, например,

$ ./your_script.sh &

Что даст вам идентификатор работы в [квадратных скобках]:

$ ./your_script.sh &
[1] 5183

(в данном случае 1).Когда вы закончите, вы можете завершить процесс с помощью

$ kill %1

Обратите внимание, знак процента указывает на то, что вы ссылаетесь на задание, а не на идентификатор процесса

1 голос
/ 05 мая 2011
awk -f ./myawkscript.awk /proc/`pidof iBrowser.bin`/smaps >> $DIRPATH \
  || exit 1

выйдет из сценария, если вызов awk завершится неудачно, что происходит, когда pidof завершается неудачно из-за ошибочного пути. Я взял на себя смелость удалить ваш UUOC .

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