Нарешті мені вдалося усунути проблему, з якою я боровся вже кілька тижнів. Я використовую SSH з "авторизованими клавішами" для віддаленого запуску команд. Все добре, за винятком випадків, коли я це роблю в певний час. Цикл завершується після завершення будь-якої ітерації командою ssh.
Довгий час я думав, що це якась дивна дивність, але зараз я виявив, що баш насправді поводиться однаково.
Невеликий зразок програми для відтворення проблеми. Це дистильовано з більшої реалізації, яка робить знімки та реплікує їх серед вузлів кластера.
#!/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
(Зверніть увагу, що в виразі grep search є символ TAB відповідно до визначення поведінки параметра "-H" у списку zfs.)
У моєму зразку є декілька файлових систем ZFS для кореня, де всі "зони" мають свою кореневу файлову систему на наборі даних, схожої на
POOL / зони / app1zone
POOL / зони / group2 / app2zone
тощо.
Вищеописаний цикл повинен створити знімок для кожного з обраних наборів даних, але замість цього він працює лише на першому, а потім на виході.
Про те, що програма знаходить потрібну кількість наборів даних, можна легко підтвердити, перевіривши файл "/ tmp / actionlist" після існування сценарію.
Якщо команду ssh замінити, наприклад, командою echo, то цикл проходить через усі вхідні рядки. Або мій улюблений - додайте «відлуння» до команди, що ображає.
Якщо я використовую цикл for замість нього, він також працює, але через потенційний розмір списку наборів даних це може спричинити проблеми з максимальною розширеною довжиною командного рядка.
Зараз я на 99,999% впевнений, що лише ті петлі з командами ssh створюють мені проблеми!
Зауважте, що ітерація, в якій виконується команда ssh, завершується! Це так, як якщо б дані, накладені на цикл while, раптом втрачаються ... Якщо перші кілька вхідних рядків не виконують команду ssh, цикл продовжується, поки він фактично не виконує команду SSH.
У моєму ноутбуці, де я тестую це, у мене є два VM Solaris 10 з лише двома-трьома наборами наборів даних, але те ж саме відбувається у великих системах SPARC, де це покликане жити, і є безліч наборів даних.
actionlist
. Спробуйте перенаправити стандартний вхід ssh на/dev/null