Tôi có một script python đơn giản tôi cần phải bắt đầu và dừng lại và tôi cần sử dụng một script start.sh và stop.sh để thực hiện nó.shell start/stop cho tập lệnh python
Tôi có start.sh:
#!/bin/sh
script='/path/to/my/script.py'
echo 'starting $script with nohup'
nohup /usr/bin/python $script &
và stop.sh
#!/bin/sh
PID=$(ps aux | grep "/path/to/my/script.py" | awk '{print $2}')
echo "killing $PID"
kill -15 $PID
tôi chủ yếu quan tâm đến kịch bản stop.sh. Tôi nghĩ rằng đó là một cách thích hợp để tìm pid nhưng tôi sẽ không đặt cược nhiều vào nó. start.sh bắt đầu thành công nó. khi tôi chạy stop.sh, tôi không còn có thể tìm thấy quá trình bằng cách "ps aux | grep 'myscript.py'"
nhưng kết quả đầu ra giao diện điều khiển:
killing 25052
25058
./stop.sh: 5: kill: No such process
nên nó có vẻ như nó hoạt động và đưa ra một lỗi của các loại với "Không có quá trình như vậy".
Đây có phải là lỗi không? Tôi có đang tiếp cận điều này một cách lành mạnh không? Có những thứ khác mà tôi nên chú ý không?
EDIT - Tôi thực sự đã kết thúc với một cái gì đó như thế này: 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
Bạn có thể lấy PID của lệnh trước đó bằng '$!'. Sau đó, bạn có thể sử dụng tệp này trong tệp 'stop.sh'. Bạn cũng không có gì trong đó để đối phó với việc bắt đầu nhiều lần và như vậy. – will