2009-06-04 44 views
7

Tôi có một vấn đề rất đơn giản: Khi tôi chạy một kịch bản lệnh shell, tôi bắt đầu một chương trình mà chạy trong một vòng lặp vô hạn. Sau một thời gian tôi muốn dừng lại sau đó chương trình này trước khi tôi có thể nó một lần nữa với các thông số khác nhau. Câu hỏi đặt ra bây giờ là làm cách nào để tìm ra pid của chương trình khi tôi thực thi nó? Về cơ bản, tôi muốn làm điều gì đó tương tự:Quá trình giết trong Shell Script

echo "Executing app1 with param1" 
./app1 param1 & 
echo "Executing app1" 
..do some other stuff 
#kill somehow app1 
echo "Execution of app1 finished!" 

Cảm ơn!

Trả lời

2

bạn có được pid của app1 với

ps ux | awk '/app1/ && !/awk/ {print $2}' 

và sau đó bạn sẽ có thể giết nó .... (tuy nhiên, nếu bạn đã một vài trường hợp app1, bạn có thể tiêu diệt' em tất cả)

5

Trong bash $! mở rộng tới PID của quá trình cuối cùng bắt đầu ở nền sau. Vì vậy, bạn có thể làm:

./app1 param1 & 
APP1PID=$! 
# ... 
kill $APP1PID 
+0

Cảm ơn tất cả câu trả lời, nhưng đây là câu trả lời yêu thích của tôi! –

15

Trong hầu hết các shell (bao gồm Bourne và C), PID của quy trình con cuối cùng bạn khởi chạy ở nền sẽ được lưu trữ trong biến đặc biệt $ !.

#!/bin/bash 
./app1 & 
PID=$! 
# ... 
kill $PID 

some information here trong phần Biến đặc biệt.

3

nếu bạn muốn tìm hiểu các PID của một quá trình, bạn có thể sử dụng ps:

[[email protected] ~]$ ps h -o pid -C app1 

tham số -o pid nói rằng bạn chỉ muốn PID của quá trình, -C app1 chỉ định tên của quy trình bạn muốn truy vấn và tham số h được sử dụng để chặn tiêu đề của bảng kết quả (không có nó, bạn sẽ thấy tiêu đề "PID" phía trên chính PID). không phải là nếu có nhiều quá trình có cùng tên, tất cả các PID sẽ được hiển thị.

nếu bạn muốn giết quá trình đó, bạn có thể muốn sử dụng:

[[email protected] ~]$ kill `ps h -o pid -C app1` 

mặc dù killall là sạch hơn nếu bạn chỉ muốn làm điều đó (và nếu bạn không nhớ giết chết tất cả "app1" quá trình). bạn cũng có thể sử dụng head hoặc tail nếu bạn chỉ muốn có PID đầu tiên hoặc cuối cùng.

và mẹo dành cho người dùng fish: %process được thay thế bằng PID của process. vì vậy, trong cá, bạn có thể sử dụng:

[email protected] ~> kill %app1 
0

Tôi gặp sự cố khi quá trình tôi giết là tập lệnh python và tôi cũng có một tập lệnh khác cũng đang chạy python. Tôi không muốn giết python vì kịch bản khác.

tôi đã sử dụng awk để đối phó với điều này (giả sử myscript được kịch bản python của bạn): giết ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

Có thể không được như hiệu quả nhưng tôi thà thương mại hiệu quả cho sự linh hoạt trong một nhiệm vụ như thế này.

Các vấn đề liên quan