2010-10-16 27 views
8

Tôi có một red5 server (JAVA) đang chạy trên máy chủ Linux của mình.Linux: Làm thế nào để tiêu diệt các chương trình sử dụng cổng 1935?

Đôi khi, máy chủ tắt. Khi tôi cố gắng khởi động lại, tôi gặp lỗi:

"Lỗi liên kết, cổng này được sử dụng nhiều hơn".

Vì vậy, tôi cố gắng giết máy chủ bằng killall -9 java và thử khởi động lại máy chủ: cùng một lỗi.

Tôi phải chờ một lúc (khoảng 2-3 phút) và khởi động lại lần nữa: hoạt động.

Tôi chỉ cần biết lý do tại sao khi tôi giết quá trình tôi vẫn phải đợi 2-3 phút trước khi cổng 1935 miễn phí và tôi có thể chạy lại máy chủ.

Có cách nào để hủy quy trình này ngay lập tức và giải phóng cổng không?

+1

tôi không tin rằng các câu trả lời đổ lỗi cho SIGKILL cho việc dọn dẹp cổng không thành công. Hệ điều hành hoàn toàn biết rằng quá trình này đã biến mất và từ bỏ nguồn lực của nó theo cách tiêu chuẩn. Cách tiêu chuẩn cho cổng nghe TCP chỉ đóng không sẵn sàng trong một thời gian để loại trừ kết nối với máy chủ sai. Điều này có thể tránh được dễ dàng nhất bằng cách sử dụng SO_REUSEADDR như đã đề cập trong câu trả lời của Justin. –

Trả lời

16

Nếu bạn chắc chắn dụ cũ của máy chủ của bạn giữ cổng, chỉ cần chạy jps, tìm pid máy chủ của bạn trong danh sách và chạy kill -9 my_pid

Đối với quá trình phi java generic, lsof -i :1935 thường làm việc cho tôi. Một lần nữa, lấy pid và giết quá trình này.

5

Nếu có thể, bạn nên sử dụng tùy chọn ổ cắm SO_REUSEADDR khi chương trình của bạn thiết lập ổ cắm. Bằng cách đó bạn có thể tái sử dụng ngay lập tức socket khi chương trình được khởi động lại, thay vì phải đợi 2-3 phút.

Xem javadoc setReuseAddress để biết thêm thông tin. Cụ thể:

When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port.

Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state.

+0

Anh ta có thể làm điều này trong Java bằng cách gọi setReuseAddress http://download.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html –

+0

Có vẻ như cả hai chúng tôi đều đang nghĩ như vậy - xem chỉnh sửa :) –

9

Sự cố là khi giết.

Nếu bạn giết quá trình bằng SIGKILL (-9), quá trình này sẽ bị chấm dứt ngay lập tức. Vì vậy, cổng vẫn được phân bổ cho đến (một vài phút sau) O.S. thông báo vấn đề. Hãy thử SIGHUP và SIGINT (theo thứ tự) trước SIGKILL.

Trong mọi trường hợp, hãy sử dụng netstat -a -t -p để xác minh quá trình nào đã nhận được cổng.

1

giết -9 không nên được sử dụng theo mặc định. Quá trình này không thể dọn sạch nội bộ. Để giết pid của ứng dụng sử dụng bởi cổng dụ 8000:

kill $(netstat -nptl | awk '/:8000/{gsub("/.*", ""); print $7}') 
+0

kill: usage: kill [-s sspspec | -n signum | -sigspec] pid | jobspec ... hoặc kill -l [sigspec] – yarek

+0

dường như có lỗi với lệnh này: kill: usage: kill [-s sspspec | -n signum | -sigspec] pid | jobspec ... hoặc kill -l [sigspec] – yarek

1

Đây là một oneliner ích:

kill $(fuser 1935/tcp) 
7

Ngay lập tức xử lý chấm dứt và cổng phát hành:

fuser -k 1935/tcp