Cuối cùng tôi cũng đã giải quyết được một vấn đề mà tôi đã phải vật lộn trong vài tuần. Tôi sử dụng SSH với "khóa được ủy quyền" để chạy các lệnh từ xa. Tất cả đều ổn trừ khi tôi làm điều đó trong một vòng lặp while. Vòng lặp chấm dứt sau khi hoàn thành bất kỳ lần lặp nào với lệnh ssh.
Trong một thời gian dài, tôi nghĩ rằng đây là một loại kỳ lạ ksh, nhưng bây giờ tôi phát hiện ra bash thực tế hành xử giống hệt nhau.
Một chương trình mẫu nhỏ để tái tạo vấn đề. Điều này được chắt lọc từ một triển khai lớn hơn trong đó có các ảnh chụp nhanh và sao chép chúng giữa các nút trong một cụm.
#!/bin/bash
set -x
IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool
ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist
#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
echo ${RMT_FILESYSTEM}@${MARKER}
[ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
echo Remote Command Return Code: $?
done
(Lưu ý có một ký tự TAB trong biểu thức tìm kiếm grep theo định nghĩa hành vi của danh sách zfs tùy chọn "-H".)
Mẫu của tôi có một số hệ thống tệp ZFS cho thư mục gốc trong đó tất cả các "vùng" có hệ thống tệp gốc của chúng trên tập dữ liệu có tên tương tự
POOL / khu vực / app1zone
POOL / khu vực / nhóm2 / app2zone
v.v.
Vòng lặp ở trên sẽ tạo một ảnh chụp nhanh cho mỗi bộ dữ liệu được chọn, nhưng thay vào đó, nó chỉ hoạt động trên cái đầu tiên và sau đó thoát.
Chương trình tìm thấy số lượng bộ dữ liệu phù hợp có thể dễ dàng xác nhận bằng cách kiểm tra tệp "/ tmp / actionlist" sau khi tập lệnh tồn tại.
Nếu lệnh ssh được thay thế bằng, ví dụ, lệnh echo, thì vòng lặp lặp qua tất cả các dòng đầu vào. Hoặc yêu thích của tôi - thêm "echo" vào lệnh vi phạm.
Nếu tôi sử dụng một vòng lặp for thay thế thì nó cũng hoạt động, nhưng do kích thước tiềm năng của danh sách các bộ dữ liệu, điều này có thể gây ra vấn đề với độ dài dòng lệnh mở rộng tối đa.
Bây giờ tôi chắc chắn 99,999% rằng chỉ những vòng lặp có lệnh ssh trong đó mới gây ra sự cố cho tôi!
Lưu ý rằng việc lặp lại trong đó lệnh ssh chạy, hoàn thành! Như thể dữ liệu được đưa vào vòng lặp while bị mất đột ngột ... Nếu một vài dòng đầu vào đầu tiên không thực hiện lệnh ssh, thì vòng lặp sẽ tiếp tục cho đến khi nó thực sự chạy lệnh SSH.
Trên máy tính xách tay của tôi, nơi tôi đang thử nghiệm, tôi có hai máy ảo Solaris 10 chỉ có khoảng hai hoặc ba bộ dữ liệu mẫu, nhưng điều tương tự đang xảy ra trên các hệ thống SPARC lớn, nơi điều này có nghĩa là sẽ hoạt động và có nhiều bộ dữ liệu.
actionlist
. Hãy thử chuyển hướng đầu vào tiêu chuẩn của ssh sang/dev/null