2012-01-16 23 views
6

Tôi mới sử dụng UNIX. Tôi muốn bắt đầu ứng dụng java của mình với một tập lệnh như vậy:Bắt đầu và tiêu diệt ứng dụng java với tập lệnh shell (Debian)

Điều này được cho là đang hoạt động. Nó chạy ứng dụng và nó ghi tập tin pid. Nhưng khi tôi cố gắng để ngăn chặn quá trình với một kịch bản khác nhau, trong đó có này:

#!/bin/sh 
kill -9 /var/run/ScriptCheck.pid 

giao diện điều khiển mang lại cho tôi lỗi này:

bash: kill: /var/run/ScriptCheck.pid: arguments must be process or job IDs 

đoán tốt nhất của tôi là tôi không viết code đúng trong tập lệnh dừng, có thể không cung cấp đúng lệnh để mở tệp .pid. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Trả lời

12

Bạn đang đi qua một tên tập tin như một cuộc tranh cãi để kill khi nó hy vọng một (Proces id) số, vì vậy chỉ cần đọc quá trình id từ tập tin đó và vượt qua nó để kill:

#!/bin/sh 
PID=$(cat /var/run/ScriptCheck.pid) 
kill -9 $PID 
+0

Cảm ơn bạn rất nhiều !!! Đây chỉ là những gì tôi đang tìm kiếm :) – rMaero

+1

Đối với bản ghi, bạn có thể sử dụng '$ ( Kevin

+0

không hoạt động trong sh, hoạt động hiệu quả, tốt hơn để sử dụng mèo – milan

0

Tôi nghĩ bạn cần phải đọc nội dung của tệp ScriptCheck.pid (mà tôi giả định chỉ có một mục nhập với PID của quy trình trong hàng đầu tiên).

#!/bin/sh 
procID=0; 
while read line  
do  
    procID="$line"; 
done </var/run/ScriptCheck.pid 
kill -9 procID 
+0

Tôi không hiểu vòng lặp trong khi bạn đã viết ở đó, và thậm chí cả với điều đó nó vẫn không làm việc. Bảng điều khiển hiện đang hiển thị như cũ .. Tôi cũng nghĩ rằng tôi cần phải đọc nội dung của tập tin pid nhưng đó là những gì tôi không biết làm thế nào để làm – rMaero

+0

Điều đó vẫn không hoạt động, bạn phải nội suy '$ procID' trong' kill'. – tripleee

0

Tôi chưa bao giờ phải tạo pid của riêng mình; câu hỏi của bạn thật thú vị.

Đây là một đoạn mã bash tôi thấy:

#!/bin/bash 

PROGRAM=/path/to/myprog 
$PROGRAM & 
PID=$! 
echo $PID > /path/to/pid/file.pid 

Bạn sẽ cần phải có quyền root để đưa file.pid của bạn vào/var/run --referenced bởi rất nhiều điều - đó là tại sao daemon có đặc quyền root.

Trong trường hợp này, bạn cần đặt pid của bạn một số nơi đã thỏa thuận, được biết đến với các tập lệnh bắt đầu và dừng của bạn. Bạn có thể sử dụng thực tế một tệp pid tồn tại, ví dụ, không cho phép một quá trình giống hệt thứ hai để chạy.

$ PROGRAM & đặt tập lệnh thành chế độ "hàng loạt" nền.

Nếu bạn muốn chương trình bị treo xung quanh sau khi tập lệnh thoát, tôi khuyên bạn nên chạy chương trình bằng nohup, có nghĩa là chương trình sẽ không chết khi tập lệnh của bạn được đăng xuất.

Tôi vừa chọn. PID được trả về với một nohup.

2

Một cách nhanh chóng và phương pháp bẩn sẽ là:

kill -9 $(cat /var/run/ScriptCheck.pid) 
2

Cú pháp của bạn sai, kill lấy một id quá trình, không phải tệp. Bạn cũng không nên sử dụng kill -9 trừ khi bạn hoàn toàn biết mình đang làm gì.

kill $(cat /var/run/ScriptCheck.pid) 

hoặc

xargs kill </var/run/ScriptCheck.pid 
Các vấn đề liên quan