Bash if语句只能证明一次

时间:2016-04-14 02:14:30

标签: bash if-statement

首先,如果问题相对宽泛,我道歉。也许有人可以相应地重新说出来。

我编写了下面的脚本来详细说明我的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脚本中添加了一个print语句,现在bash脚本正在回显print语句:

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) 

2 个答案:

答案 0 :(得分:3)

您需要在后台运行deamon.py进程并将控制权返回给脚本,如:

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

否则,脚本将等待deamon.py完成后再继续。

答案 1 :(得分:0)

从grep中排除grep。

当您运行ps ax | grep 'deamon.py$'时,deamon.py$将出现在ps列表中。你得到一个误报:守护进程可能没有运行,但你永远不会知道,因为你总是与grep匹配。

强力方法是将shell命令更改为

ps ax | grep 'deamon.py$' | grep -v grep