2012-05-30 26 views
12

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 đó ...

Trả lời

13

SOLVED

Nhờ this SO question, tôi đã thay đổi kịch bản của tôi như thế này:

#!/bin/bash 
SITE=/home/dev/sites/rmx 

echo "RMX using siteroot=$SITE" 
$SITE/rmx/manage.py runserver & 
compass watch $SITE/media/compass/ & 
coffee -o $SITE/media/js -cw $SITE/media/coffee & 
hamlpy-watcher $SITE/templates/hamlpy $SITE/templates/templates & 

trap "kill -TERM -$$" SIGINT 

wait 

PID bắt đầu bằng các dấu gạch ngang hoạt động trên nhóm PID PID với lệnh kill và số $$ tham chiếu PID của chính tập lệnh bash.

Cảm ơn sự giúp đỡ, tôi!
Không có vấn đề, tự, và hey - bạn thật tuyệt vời.

+0

+1 để tự chúc mừng – jstaab

0

Bạn có thể thực hiện điều này để giết hoặc quá trình và máy chủ, bạn thiết lập số PORT:

$ netstat -tulpn | grep PORT | awk '{print $7}' | cut -d/ -f 1 | xargs kill 

HOẶC

$ sudo lsof -i tcp:PORT 
$ sudo lsof -i tcp:PORT|awk '{print $2}'|cut -d/ -f 1|xargs kill 
Các vấn đề liên quan