2016-04-14 4 views
0

まず、質問が比較的幅広い場合は謝ります。おそらく誰かがそれに応じて言葉を改めることができます。Bash ifステートメントは一度だけ真実であることを証明します

私はbashのスキルを詳しく説明するために以下のスクリプトを書いていますが、ifステートメントは手動で「監視する」という意味のPythonスクリプトを手動で起動した場合にのみ真となります。

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

私は手動で./run_deamon.sh bashスクリプトを実行して手動で、その後./deamon.py実行している場合は、 "Pythonが...ランニングdeamon.py" アウトエコー表示します。私はその後、deamon.pyプロセスとbashスクリプトのechos "Starting Python deamon.py ..."を終了します。 bashスクリプトがdeamon.pyを起動した後も、 "Python deamon.py running ..."とエッチしなくなりました。誰かが私が間違っていることを説明できますか?

私は出力に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) 
+0

「デーモン」の綴りは、「ea」ではなく「ae」であることに注意してください。 –

答えて

3

にあなたのシェルコマンドを変更することですそれ以外の場合、スクリプトは続行する前にdeamon.pyが終了するのを待ちます。

+0

うん - それは問題です! –

+0

これは機能しました。しかし、行末のセミコロンは私に構文エラーを与えます。セミコロンなしで完璧に動作します。どうもありがとうございました – jes516

0

はgrepのからのgrepを除外する。

ps ax | grep 'deamon.py$'を実行すると、deamon.py$はpsリストになります。あなたは偽陽性になっています:デーモンが実行されていないかもしれませんが、grepと常に一致するため、デーモンはわからないでしょう。

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

強引な方法は、あなたがバックグラウンドでdeamon.pyプロセスを実行し、ようなスクリプトに制御を返す必要が

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

あるいは、この種のもののために書かれた 'pgrep'を使用してください。 –

+0

@Paul Hicks同じ結果です。コメントに編集を追加しました。私は '| grep -v grep'と 'pgrep' – jes516

+0

'grep deamon.py $'を得ると、grepとマッチしません。正規表現の' $ 'は 'end of line'を意味し、' $ 'は'ps'の出力は' .py'が行末にないことを意味します。 –

関連する問題