5

開始および停止する必要がある単純な python スクリプトがあり、それを行うには start.sh および stop.sh スクリプトを使用する必要があります。

私はstart.shを持っています:

#!/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 スクリプトに関心があります。それはpidを見つけるための適切な方法だと思いますが、私はそれにあまり賭けません。start.sh は正常に開始します。stop.sh を実行すると、プロセスを見つけることができなくなります"ps aux | grep 'myscript.py'"が、コンソールの出力は次のとおりです。

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

そのため、機能しているように見え、「そのようなプロセスはありません」というエラーが発生します。

これは実際にはエラーですか?私はこれに正気で近づいていますか?他に注意すべき点はありますか?

編集-私は実際に次のようなものになりました: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
4

5 に答える 5

4

それは、SOMETHING が一致するためps aux |grep SOMETHING、プロセスも検索されるためです。grep SOMETHING実行後、grepは終了しているため、見つけることができません。

次の行を追加します。ps aux | grep -v grep | grep YOURSCRIPT

-v は除外を意味します。詳しくはman grep.

于 2013-07-16T20:33:31.240 に答える
2

正しい」アプローチは、おそらく、スクリプトで pid を /var/run のファイルに書き込み、スクリプトを強制終了するときにそれをクリアすることです。スクリプトを変更できない場合は、start-stop-daemonを参照してください。

grepのようなアプローチを続けたい場合は、 proctoolsをご覧ください。それらはほとんどの GNU/Linux マシンに組み込まれており、OS X を含む BSD ですぐに利用できます。

pkill -f /path/to/my/script.py
于 2013-07-16T20:38:53.223 に答える
2

これには、init タイプのスクリプトが役立ちます。これは私が使っているものと非常によく似ています。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
于 2013-07-16T21:06:47.287 に答える
1

ps補助 | grep "/path/to/my/script.py"

script.py のインスタンスの pid と、この grep のインスタンスの両方の pid を返します。これがおそらく、そのようなプロセスが発生しない理由です。grep を強制終了するまでに、grep はすでに死んでいます。

于 2013-07-16T20:33:35.263 に答える
0

現時点では UNIX ボックスを使用していないため、これをテストすることはできませんが、アイデアを得るのはかなり簡単なはずです。

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

stop.sh:

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

これを試してみてください。

于 2013-07-16T20:41:26.530 に答える