Tôi đang làm việc trên một trang web Django nơi tôi có các chương trình biên soạn khác nhau mà cần phải chạy (Compass/Sass, coffeescript, hamlpy), vì vậy tôi đã shell script này để tiện theo dõi:Làm thế nào để tiêu diệt các tiến trình phụ của trình điều khiển Django từ một tập lệnh bash?
#!/bin/bash
SITE=/home/dev/sites/rmx
echo "RMX using siteroot=$SITE"
$SITE/rmx/manage.py runserver &
PIDS[0]=$!
compass watch $SITE/media/compass/ &
PIDS[1]=$!
coffee -o $SITE/media/js -cw $SITE/media/coffee &
PIDS[2]=$!
hamlpy-watcher $SITE/templates/hamlpy $SITE/templates/templates &
PIDS[3]=$!
trap "echo PIDS: ${PIDS[*]} && kill ${PIDS[*]}" SIGINT
wait
Tất cả mọi thứ ngoại trừ Máy chủ Django tắt độc đáo trên ctrl+c
vì PID của quá trình máy chủ không phải là PID của lệnh python manage.py runserver
. Điều đó có nghĩa là mọi lúc tôi dừng kịch bản, tôi phải tìm PID đang chạy và tắt nó đi.
Dưới đây là một ví dụ:
$> ./compile.sh
RMX using siteroot....
...
[ctrl+c]
PIDS: 29725 29726 29728 29729
$> ps -A | grep python
29732 pts/2 00:00:00 python
Các PID đầu tiên, 29725
, là ban đầu python manage.py runserver
cuộc gọi, nhưng 29732
là quá trình máy chủ dev thực tế.
chỉnh sửa Có vẻ như đây là do Django's auto-reload feature có thể bị vô hiệu hóa với cờ --noreload
. Vì tôi muốn giữ tính năng tự động tải lại, câu hỏi bây giờ sẽ trở thành cách giết các tiến trình con từ tập lệnh bash. Tôi nghĩ rằng giết chết các ban lệnh python runserver sẽ làm điều đó ...
+1 để tự chúc mừng – jstaab