shell iniciar / detener para el script de Python

Tengo una secuencia de comandos de Python simple que necesito para iniciar y detener y necesito usar una secuencia de comandos start.sh y stop.sh para hacerlo.

Tengo start.sh:

#!/bin/sh script='/path/to/my/script.py' echo 'starting $script with nohup' nohup /usr/bin/python $script & 

y stop.sh

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

Estoy principalmente preocupado por el script stop.sh. Creo que es una forma adecuada de encontrar el pid pero no apostaría mucho en él. start.sh lo inicia con éxito. cuando ejecuto stop.sh, ya no puedo encontrar el proceso con "ps aux | grep 'myscript.py'" pero la consola "ps aux | grep 'myscript.py'" :

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

por lo que parece que funciona Y da un error de tipo con “No tal proceso”.

¿Es esto realmente un error? ¿Me estoy acercando a esto de una manera sana? ¿Hay otras cosas a las que debería prestar atención?

EDITAR – De hecho, terminé con algo como esto: 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 

Se debe a que ps aux |grep SOMETHING también encuentra el proceso grep SOMETHING , porque SOMETHING coincide. Después de la ejecución, el grep finaliza, por lo que no puede encontrarlo.

Añadir una línea: ps aux | grep -v grep | grep YOURSCRIPT ps aux | grep -v grep | grep YOURSCRIPT

Donde -v significa excluir. Más en man grep .

Los scripts de tipo init son útiles para esto. Esto es muy similar a uno que uso. Almacena el pid en un archivo, y cuando quieras verificar si está funcionando, busca en el sistema de archivos / 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 " exit ;; esac 

ps aux | grep “/path/to/my/script.py”

devolverá tanto el pid para la instancia de script.py como también esta instancia de grep. Probablemente esa sea la razón por la que no estás recibiendo un proceso así: cuando llegas a matar al grep, ya está muerto.

El enfoque “correcto” probablemente sería hacer que su script escriba su pid en un archivo en / var / run, y lo borre cuando elimine el script. Si cambiar la secuencia de comandos no es una opción, eche un vistazo a start-stop-daemon .

Si desea continuar con el enfoque similar a grep , eche un vistazo a proctools . Están incorporados en la mayoría de las máquinas GNU / Linux y están disponibles en BSD, incluido OS X:

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

No tengo una caja de Unix en este momento, así que no puedo probar esto, pero debería ser bastante simple para entender la idea.

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 

Probar esto.