Прежде всего, мои извинения, если вопрос относительно широкий. Возможно, кто-то сможет переформулировать это соответствующим образом.

Я написал приведенный ниже сценарий, чтобы подробно рассказать о моем навыке bash, однако оператор if оказывается верным только в том случае, если я вручную запускаю сценарий python, который предназначен для «мониторинга».

bash script = run_deamon.sh
python script = deamon.py

Если я вручную запустил ./deamon.py, а затем вручную ./run_deamon.sh, сценарий bash отобразит «Python deamon.py running ...». Затем я могу продолжить, чтобы убить процесс deamon.py, и мой сценарий bash отобразит «Запуск Python deamon.py ...». После того, как сценарий bash запускает deamon.py, он больше не повторяет «Python deamon.py запущен ...» Может ли кто-нибудь объяснить, что я делаю неправильно?

Я хочу, чтобы сценарий bash выводил:

Python deamon.py running...
Python deamon.py running...
Python deamon.py running... (I now kill deamon.py)
Starting Python deamon.py...
Python deamon.py running...
Python deamon.py running...

Др...

Я пробовал следующее:

while true; do                                                                  
    if [[ $(ps ax | grep 'deamon.py$') ]]; then                                 
        echo Python deamon.py running...;                                       
    else                                                                        
        echo Starting Python deamon.py...;                                      
        /home/bang/Documents/Python/./deamon.py;                                
    fi                                                                          
    sleep 1                                                                     
done 

А также

while true; do                                                                  
    if [[ $(ps ax | grep 'deamon.py$') ]]; then                                 
        echo Python deamon.py is running...;                                    
    fi                                                                          

    if ! [[ $(ps ax | grep 'deamon.py$') ]]; then                               
        echo Starting Python deamon.py...;                                      
        /home/bang/Documents/Python/./deamon.py;                                
    fi                                                                          

    sleep 1;                                                                                              
done  

Такое же поведение.

Я очень признателен, если кто-то может указать мне правильное направление.

Изменить №1

Я использовал

if [[ $(ps ax | grep 'deamon.py$' | grep -v grep) ]]; then

А также

if [[ $(ps ax | pgrep -f 'deamon.py$' ]]; then

Тот же результат. Я добавил оператор печати в свой скрипт Python, и теперь скрипт bash повторяет оператор печати:

23
24
25
Starting Python deamon.py...
0
1
2
3

Это мой скрипт на python:

from time import sleep                                                          

x = 0                                                                           

while True:                                                                     
    print(x)                                                                    
    if x == 25:                                                                 
        exit(0)                                                                 
    x += 1                                                                      
    sleep(1) 
0
jes516 14 Апр 2016 в 05:14

2 ответа

Лучший ответ

Вам нужно запустить процесс deamon.py в фоновом режиме и вернуть управление скрипту, например:

/home/bang/Documents/Python/./deamon.py & ;

В противном случае сценарий будет ждать завершения deamon.py, прежде чем продолжить.

3
Munir 14 Апр 2016 в 03:18

Исключите grep из grep.

Когда вы запустите ps ax | grep 'deamon.py$', тогда deamon.py$ будет в списке ps. Вы получаете ложное срабатывание: демон может не работать, но вы никогда не узнаете, потому что вы всегда будете сравнивать с grep.

Методом грубой силы было бы изменить вашу команду оболочки на

ps ax | grep 'deamon.py$' | grep -v grep
0
Paul Hicks 14 Апр 2016 в 02:18