Od pewnego czasu walę głową o ścianę.Bash podczas przerwania pętli odczytu na początku
Chcę SSH w zestaw maszyn i sprawdzić, czy są one dostępne (przyjmowanie połączeń i nie są używane). Stworzyłem mały skrypt, tssh, który właśnie to:
#!/bin/bash
host=$1
timeout=${2:-1}
ssh -qo "ConnectTimeout $timeout" $host "[ \`who | cut -f1 | wc -l \` -eq 0 ] && exit 0 || exit 1"
Ten skrypt działa poprawnie. Powracanie 255, jeśli wystąpił problem z połączeniem, 1 jeśli maszyna jest zajęta i 0, jeśli wszystko jest w porządku. Jeśli ktoś zna lepszy sposób, aby to zrobić, proszę dać mi znać.
W następnej kolejności próbuję wywołać tssh na moim zestawie maszyn za pomocą pętli read while, i tu wszystko idzie źle. Pętla kończy działanie, gdy tssh zwróci 0 i nigdy nie zakończy pełnego zbioru.
while read nu ; do tssh "MYBOXES$nu" ; done < <(ruby -e '(0..20).each { |i| puts i }')
Początkowo myślałem, że to problem z podpowłoką, ale najwyraźniej nie. Każda pomoc, wraz z komentarzem na temat stylu/treści, byłaby bardzo doceniana! wiem Idę kopać siebie, kiedy dowiem się dlaczego ...
Mam podobny problem z Perl Net :: SSH :: Perl @ Foo-Bah opisał ten problem bardzo dobrze, a rozwiązaniem jest dodanie pusty ciąg jako parametr do cmd: https://metacpan.org/pod/Net::SSH::Perl#out-err-exit-ssh-cmd-cmd-stdin my ($ stdout, $ stderr, $ exit) = $ ssh-> cmd ($ cmd, ""); – Thomas