2011-07-06 23 views
6

Tôi có một bộ mô tả tập tin trỏ tới một ổ cắm (ví dụ mã bên dưới).Kiểm tra xem ổ cắm có bị đóng trong bash không?

exec 3<>/dev/tcp/localhost/9999 
echo -e "Some Command\n" >&3 

Đôi khi ổ cắm đó đóng và cần được mở lại (khởi động lại máy chủ).

Làm cách nào để kiểm tra xem ổ cắm (fd # 3 trong trường hợp này) có thể ghi được không?

Tiếng vang sẽ luôn thành công, bất kể ổ cắm đã được đóng hay chưa.

+0

Bạn có muốn biết liệu nó có _is writable_ ** hay ** liệu _it có bị đóng_ không? Đầu tiên là một câu hỏi quyền, sau đó là câu hỏi của nhà nước. Đây chỉ là một chút liên quan (các filemode hiệu quả có thể bị ảnh hưởng bởi các cờ mở, có thể được gọi là _state_ nếu bạn muốn) – sehe

+0

@sehe Nó không phải là một câu hỏi quyền. Anh ấy đang nói về ổ cắm. Không có quyền ghi được kết hợp với ổ cắm. Nếu bạn có thể mở ổ cắm, bạn có thể đọc nó và viết nó. – EJP

+0

Cụ thể nhất là nếu nó bị đóng. Tôi biết nó có thể ghi, tôi có thể mở ổ cắm trong điều kiện bình thường, nhưng khi tôi mất kết nối (vấn đề mạng, máy chủ tắt trong khi kịch bản đang chạy, vv) Tôi cần phải cố gắng mở lại nó trước khi tiếp tục. –

Trả lời

4

Giải pháp là phản hồi từ máy chủ.

Khi bạn gửi yêu cầu đến máy chủ, nó cần trả lời cho nó.

exec 3<>/dev/tcp/localhost/9999 
echo -e "Some Command\n" >&3 
sleep 5 # example max time given to server to respond 
cat <&3 #receive an answer 
check is correct, restart server otherwise 

EDIT: sử dụng netcat để xác định là cổng được mở

netcat -w 3 -z www.google.com 80 
if[ $? -eq 0 ] 
then 
    echo port open 
else 
    echo port closed 
fi 
+0

Ý tưởng hay, rất tiếc đó là nguồn cấp dữ liệu một chiều không có phản hồi. –

+0

Trong trường hợp đó; có lẽ bằng cách sử dụng netcat để xác định là cổng mở hay không? – bbaja42

+0

Bạn cũng có thể thêm "telnet" vào danh sách. Tôi không thực sự tha thứ bằng cách sử dụng telnet nhưng tôi nhớ sử dụng nó trên một hệ thống cũ mà không có/dev và không có netcat. –

0

Bạn có thể sử dụng lệnh netstat, grep cho cổng/địa chỉ mà bạn muốn, và sau đó cut chỉ là lĩnh vực nhà nước. Xin lưu ý rằng một ổ cắm có thể xuất hiện dưới dạng "THÀNH LẬP" trong một thời gian sau khi kết nối bị mất, đặc biệt nếu bạn không gửi bất kỳ dữ liệu nào đến nó.

0

Hãy thử bằng văn bản cho fd:

Lưu ý rằng tôi không thấy ghi dữ liệu cần thiết để kiểm tra xem mô tả tập tin vẫn còn hiệu lực, nhưng tôi gợi ý rằng bạn chỉ đơn giản là cố gắng để viết bất kỳ dữ liệu bạn muốn và sau đó kiểm tra xem nó có hoạt động không. Nếu viết không thành công, mở lại các ổ cắm và viết lại.

1

tôi sẽ bổ sung thêm giải pháp cuối cùng của riêng tôi (trong ngắn gọn psudo-code):

{ while true; 
    read file; 
    write to STDOUT } | 
{ while true; 
    netcat command; 
    write STDIN to buffer when/if netcat exits; 
    loop to restart netcat & first process buffered data if exists; } 

này tách đầu ra của dữ liệu (đọc của một tập tin) và quá trình xử lý dữ liệu (gửi nó cho một hoặc cắm vào một tệp khi không có ổ cắm nào). Nó sử dụng đường ống để cung cấp một bộ đệm tạm thời khi các sự cố mạng xảy ra.

STDIN của khối mã thứ hai đệm đầu ra từ khóa mã đầu tiên. Nếu netcat không thể xử lý dữ liệu trên stdin, nó sẽ chọn ghi ra tệp đệm và thử khởi động lại netcat. Bằng cách này bạn không có bất kỳ khoảng thời gian nào giữa việc kiểm tra xem ổ cắm đó có đang mở hay không (cái gì đó vẫn còn phức tạp) và ghi thực tế (có thể vẫn thất bại sau khi kiểm tra xem nó đã mở).

3

Đã một thời gian kể từ khi op đăng bài này để họ có thể không nhìn thấy điều này nhưng nó có thể giúp người khác.

Dù sao thì tôi đã xem xét vấn đề này và tôi đã tìm thấy những điều sau đây.

Mở fd (mô tả tệp) của quy trình được liệt kê trong/proc // fd.

exec 3<>/dev/tcp/localhost/9999 

#check if still connected 
if [ $(ls /proc/$$/fd | grep -w "3") == 3 ]; then 
    #send data 
    echo -e "Some Command\n" >&3 
else 
    #perform reconnect 
    exec 3<>/dev/tcp/localhost/9999 
fi 

Điều này chưa được kiểm tra nhưng hầu như là ok. Cũng có thể có một số cải tiến. Ngoài ra còn có một cửa sổ nơi fd biến mất giữa séc của bạn và văn bản thành fd. Tuy nhiên, tất cả các giải pháp cho đến nay.

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