2013-07-16 13 views
5

私は開始と停止が必要な単純なpythonスクリプトを持っています。私はstart.shとstop.shスクリプトを使用してそれを行う必要があります。pythonスクリプトのシェルの開始/停止

#!/bin/sh 

script='/path/to/my/script.py' 
echo 'starting $script with nohup' 

nohup /usr/bin/python $script & 

とstop.sh

#!/bin/sh 

PID=$(ps aux | grep "/path/to/my/script.py" | awk '{print $2}') 
echo "killing $PID" 
kill -15 $PID 

私はstop.shスクリプトで主に心配:

私はstart.shを持っています。私はと思うそれはpidを見つけるための適切な方法ですが、私はそれに多くを賭けませんでした。 start.shが正常に起動します。私はstop.shを実行したとき、私はもはや"ps aux | grep 'myscript.py'"が、コンソール出力によってプロセスを見つけることができません:それは作品と「いいえ、そのようなプロセス」とのある種の誤差を与えるよう

killing 25052 
25058 
./stop.sh: 5: kill: No such process 

はそうそれはそう。

これは実際にはエラーですか?私はまともな方法でこれに近づいていますか?私が注意を払うべき他のものはありますか? -

EDITは、私が実際にこのようなものになってしまった: start.sh

#!/bin/bash 
ENVT=$1 
COMPONENTS=$2 


TARGETS=("/home/user/project/modules/script1.py" "/home/user/project/modules/script2.py") 
for target in "${TARGETS[@]}" 
do 
     PID=$(ps aux | grep -v grep | grep $target | awk '{print $2}') 
     echo $PID 
     if [[ -z "$PID" ]] 
     then 
       echo "starting $target with nohup for env't: $ENVT" 
       nohup python $target $ENVT $COMPONENTS & 
     fi 
done 

stop.sh

#!/bin/bash 
ENVT=$1 

TARGETS=("/home/user/project/modules/script1.py" "/home/user/project/modules/script2.py") 
for target in "${TARGETS[@]}" 
do 
    pkill -f $target 
    echo "killing process $target" 
done 
+1

前のコマンドのPIDは '$! 'で得ることができます。そして、これを 'stop.sh'ファイルで使用することができます。また、何度も何度も何度も何度も何度も何度も何度も何度も何度も起きていることに対処するものはありませ – will

答えて

4

ps aux |grep SOMETHINGもSOMETHINGので、grep SOMETHINGプロセスを見つけたからです一致します。実行後、grepは終了し、見つからない。 ps aux | grep -v grep | grep YOURSCRIPT

-v手段は除外する:

は、行を追加します。 man grepの詳細。

1

ps aux | grep "/path/to/my/script.py"

は、script.pyのインスタンスのpidとこのgrepのインスタンスの両方を返します。それはたぶんあなたがそのようなプロセスを取っていない理由でしょう。あなたがgrepを殺すことに慣れると、すでに死んでいます。

1

"correct"のアプローチは、おそらくあなたのスクリプトに/ var/runのファイルにpidを書き込ませ、スクリプトを終了させるときにそれをクリアすることです。スクリプトの変更がオプションでない場合は、start-stop-daemonをご覧ください。

grepのようなアプローチを継続したい場合は、proctoolsをご覧ください。それは

pkill -f /path/to/my/script.py 
0

私は、現時点では上のUNIXボックスを持っていないので、私はこれをテストすることはできませんが、:彼らはほとんどのGNU/Linuxマシン上で構築されており、容易に利用可能なOS Xを含むBSDにしていますアイデアを得るにはかなりシンプルでなければなりません。

start.sh:

if [ -e ./temp ] 
then 
    pid=`cat temp` 
    echo "Process already exists; $pid" 
else 
    script='/path/to/my/script.py' 
    echo 'starting $script with nohup' 
    nohup /usr/bin/python $script & 
    echo $! > temp 
fi 

停止。sh:

if [ -e ./temp ] 
then 
    pid=`cat temp` 
    echo "killing $pid" 
    kill -15 $PID 
    rm temp 
else 
    echo "Process not started" 
fi 

これを試してください。

+0

@Bradファイルが存在するかどうかを確認します。 [here](http://tldp.org/LDP/abs/html/fto.html)を参照してください。 – will

2

init-typeスクリプトはこれに便利です。これは私が使用するものと非常に似ています。あなたはファイルにpidを格納し、実行しているかどうかをチェックするときは、/ procファイルシステムを調べます。

#!/bin/bash 

script_home=/path/to/my 
script_name="$script_home/script.py" 
pid_file="$script_home/script.pid" 

# returns a boolean and optionally the pid 
running() { 
    local status=false 
    if [[ -f $pid_file ]]; then 
     # check to see it corresponds to the running script 
     local pid=$(< "$pid_file") 
     local cmdline=/proc/$pid/cmdline 
     # you may need to adjust the regexp in the grep command 
     if [[ -f $cmdline ]] && grep -q "$script_name" $cmdline; then 
      status="true $pid" 
     fi 
    fi 
    echo $status 
} 

start() { 
    echo "starting $script_name" 
    nohup "$script_name" & 
    echo $! > "$pid_file" 
} 

stop() { 
    # `kill -0 pid` returns successfully if the pid is running, but does not 
    # actually kill it. 
    kill -0 $1 && kill $1 
    rm "$pid_file" 
    echo "stopped" 
} 

read running pid < <(running) 

case $1 in 
    start) 
     if $running; then 
      echo "$script_name is already running with PID $pid" 
     else 
      start 
     fi 
     ;; 
    stop) 
     stop $pid 
     ;; 
    restart) 
     stop $pid 
     start 
     ;; 
    status) 
     if $running; then 
      echo "$script_name is running with PID $pid" 
     else 
      echo "$script_name is not running" 
     fi 
     ;; 
    *) echo "usage: $0 <start|stop|restart|status>" 
     exit 
     ;; 
esac 
関連する問題