2011-11-10 28 views
7

tôi chạy một kịch bản như:Làm thế nào để bảo vệ đầu ra kill

sleep 20 & 
PID=$! 
kill -9 $PID >/dev/null 2>&1 

Tôi không muốn kịch bản hiển thị đầu ra như:

line 51: 22943 Killed sleep 

Tôi không có ý tưởng tại sao điều này xảy ra, tôi có chuyển hướng đầu ra tới/dev/null

Trả lời

15

Thông báo không đến từ một trong hai lệnh kill hoặc lệnh nền, nó đến từ bash khi phát hiện ra rằng một trong các công việc nền của nó đã bị giết. Để tránh những tin nhắn, sử dụng disown để xoá bỏ nó khỏi sự kiểm soát công việc của bash:

sleep 20 & 
PID=$! 
disown $PID 
kill -9 $PID 
+0

tuyệt vời, đây là những gì tôi muốn, cảm ơn rất nhiều người đàn ông .. – chemila

+0

disown có ngụ ý của vỏ không gửi 'SIGHUP' cho đứa trẻ khi nó chấm dứt, xem [câu hỏi này] (http://unix.stackexchange.com/câu hỏi/3886/sự khác biệt giữa-nohup-disown-và). Đây là [answer] (http://stackoverflow.com/a/5722850/52499). –

6

Điều này có thể được thực hiện bằng 'chờ' + chuyển hướng của chờ đợi đến/dev/null:

sleep 2 & 
PID=$! 
kill -9 $PID 
wait $PID 2>/dev/null 
sleep 2 
sleep 2 
sleep 2 

Kịch bản này sẽ không cung cấp cho các "giết" thông điệp:

-bash-4.1$ ./test 
-bash-4.1$ 

trong khi, nếu bạn cố gắng sử dụng một cái gì đó như:

sleep 2 & 
PID=$! 
kill -9 $PID 2>/dev/null 
sleep 2 
sleep 2 
sleep 2 

Nó sẽ ra thông điệp:

-bash-4.1$ ./test 
./test: line 4: 5520 Killed     sleep 2 
-bash-4.1$ 

Tôi thích giải pháp này nhiều hơn so với sử dụng 'không nhận' có thể có ý nghĩa khác.

nguồn Idea: https://stackoverflow.com/a/5722850/1208218

+0

Điều này có thể được cải thiện một chút bằng cách thay đổi câu lệnh kill -9 thành: kill -9 $ PID 2>/dev/null Điều này là do việc giết cũng có thể xuất ra các thông báo khác như: dòng 3: kill: (3968) - Không có quá trình như vậy Tùy thuộc vào những gì kịch bản đang làm – Roel

-1

Một cách khác để vô hiệu hóa thông báo công việc là đặt lệnh của bạn để được backgrounded trong một cấu trúc sh -c 'cmd &'.

#!/bin/bash 

# ... 

sh -c ' 
sleep 20 & 
PID=$! 
kill -9 $PID # >/dev/null 2>&1 
' 

# ... 
-1

Tôi có thể thực hiện việc này bằng cách chuyển hướng đầu ra của lệnh mà tôi đang chạy trong nền. Trong trường hợp của bạn nó sẽ trông giống như:

sleep 20 >>${LOG_FILE} 2>&1 & 

... hoặc nếu bạn không muốn có một log file:

sleep 20 &> /dev/null & 

Sau đó, khi bạn muốn giết rằng quá trình nền PID, nó sẽ không hiển thị trên tiêu chuẩn.

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