2010-01-27 9 views
0

В Баше, я создал простой демон для выполнения команд, когда мои интернеты изменение соединения:процессов управления Создана Bash Daemon

#!/bin/bash 

doService(){ 
    while 
    do 
    checkTheInternetConnection 
    sleep 15 
    done 
} 

checkTheInternetConnection(){ 
    if unchanged since last check 
     return 
    else 
     execute someCommand 
    fi 
} 

someCommand(){ 
    do something 
} 

doService 

И это работает очень хорошо, что мне нужно это делать.

Единственная проблема заключается в том, что, как часть моего «someCommand» и «checkTheInternetConnection» Я использую другие встроенные утилиты, как Арп, AWK, Grep, голову и т.д.

Однако, 99% времени , Мне просто понадобится arp.

Первый вопрос: Необходимо ли открывать другие команды? Есть ли способ убить команду, как только я уже обработал ее выход?


Другим вопрос: (Перенесено на новом посте) Я имею адское время пытаюсь написать функцию «убить все другие процессы демона». Я никогда не хочу запускать сразу несколько демонов. Какие-либо предложения? Это то, что у меня есть:

otherprocess=`ps ux | awk '/BashScriptName/ && !/awk/ {print $2}'| grep -Ev $$` 

    WriteLogLine "Checking for running daemons." 

    if [ "$otherprocess" != "" ]; then 
     WriteLogLine "There are other daemons running, killing all others." 
     VAR=`echo "$otherprocess" |grep -Ev $$| sed 's/^/kill /'` 
     `$VAR` 
    else 
     WriteLogLine "There are no daemons running."  
    fi 
+0

Возможно, лучше разделить второй вопрос на новое сообщение. – dpb

ответ

0

Можете ли вы подробнее задать первый вопрос?Я думаю, вы спрашиваете о запуске множества команд, связанных вместе (cat xxx | grep yyy | tail -zzz).

Каждая команда будет продолжать работать, пока ее труба не будет иметь данные (не достигнута EOF). Таким образом, в этом примере grep выйдет только после того, как кошка обработает весь вход и закроет его конец. Но здесь есть трюк, кошка только закрывает свой конец трубы, если grep уже считывает все (буферизует, по крайней мере) вход, потому что записывающий вызов в трубах блокируется. Поэтому вам нужно иметь это в виду при разработке ваших сценариев.

Но я не думаю, что вам следует беспокоиться о встроенных утилитах. Как правило, они имеют низкий объем памяти, если это вызывает беспокойство.

+0

Да, у меня действительно есть действительно длинные командные трубы. Но если это не заставляет вас беспокоиться, тогда я не буду - :) –

0

Для вашего первого вопроса. Я не совсем понимаю это полностью, но я вижу, что вы можете задавать одну из двух вещей.

  1. Вы запускаете вещи в функции bash (grep, awk, sed и т. Д.), И поскольку эта функция работает долго, вы опасаетесь, что запущенные вами утилиты каким-то образом останутся открытыми.
  2. Вы передаете выходные данные из одной команды в другую и боитесь, что команда останется открытой после ее завершения.

Ни один, ни 2 не оставят команды утилиты «открытыми» после того, как они закончены. Это можно доказать, добавив

ps -ef | grep "command" | grep -v 'grep' 

всего кода, чтобы увидеть, что именно работает под этим именем. или

ps -ef | grep "$$" | grep -v 'grep' 

, в котором будут перечислены события, которые породил текущий процесс.

UPDATE:

Таким образом, кажется, что вы заинтересованы в том, как вещи работать из трубы. Вы можете увидеть это визуально с помощью следующей команды:

$ ls/| grep bin | grep bin | ps -ef | grep ls 
$ 

сравнить что-то вроде:

$ find ~ | grep bin | ps -ef | grep find 
$ 

Обратите внимание, как «LS» больше не в списке процессов, но находка. Возможно, вам придется добавить в конвейер больше команд «grep bin», чтобы получить эффект. Как только первая команда будет завершена, она будет закрыта, даже если остальные команды еще не закончены. Другие команды завершатся, когда они будут обработаны выходным сигналом от первого (таким образом, характер трубопровода)

+0

Хорошо - позвольте мне уточнить. По существу, да (2). И это не значит, что я боюсь, что это происходит - это происходит, ха-ха. В мониторе активности на моем Mac я вижу функции bash, которые не вызывают в настоящее время. Они не занимают процессорного времени, но мне интересно, насколько это неэффективно. –

 Смежные вопросы

  • Нет связанных вопросов^_^