#javascript #while-loop #infinite-loop #mongo-shell
#javascript #цикл while #бесконечный цикл #mongo-оболочка
Вопрос:
Написание скрипта bash, в котором я подключаюсь к mongo-shell. У меня есть следующий вывод для rs.status()
. Я должен дождаться, пока один из членов изменит значение stateStr
на Secondary
. В приведенном ниже выводе вы можете видеть, прямо сейчас он говорит Not active
. Я хочу написать бесконечный цикл, который будет перебирать все элементы и проверять stateStr
каждые 30 секунд, пока не появится Secondary
.
"members" : [
{ "stateStr" : "Not active" },
{ "stateStr" : "PRIMARY" },
{ "stateStr" : "ARBITER" }
],
Вот что у меня есть до сих пор:
mongo --host ${other_host} ${ssl_mode} <<EOF
while (true){
for (i = 0; i <= 2; i ){
if (rs.status().members[i].stateStr == "SECONDARY") {
break;
}
}
}
rs.status();
EOF
Однако это не выходит из бесконечного цикла. И я хочу проверять каждые 30 секунд. Как мне это сделать?
Ответ №1:
mongo --host ${other_host} ${ssl_mode} << EOF
while (rs.status().members.every(e => e.stateStr != "SECONDARY")) {
sleep(1000);
}
rs.status();
EOF
Обратите внимание, что я также добавил a sleep
, чтобы избежать напряженного ожидания.
Обновление 1: если ваша версия mongo немного старше, возможно, вы не сможете использовать функции со стрелками, и вам нужно будет указать это следующим образом:
while (rs.status().members.every(function(e) { return e.stateStr != "SECONDARY"; })) {
Комментарии:
1. На самом деле это действительно классный синтаксис, о котором я не знал. как бы я также искал «if stateStr=Primary amp;amp; stateStr= Arbiter» для каждого члена, используя тот же синтаксис. Если найдено, то завершите вывод с помощью print («Успех»), иначе завершите вывод с помощью print («Сбой»)? Это будет сделано после того, как я выйду из цикла while. Кроме того, по какой-то причине он выводит «null», хотя это работает, я попытался использовать —quiet в строке, где я подключаюсь к оболочке mongo, но это не помогло.
2. Готово! Я попробовал это: if (rs.status().members.every(function(e) { return e.stateStr = «АРБИТР» amp;amp; e.stateStr = «ПЕРВИЧНЫЙ» })) { print(«Все узлы запущены и работают»); } но это не удалось
3. a) вы используете = (назначение), когда вы должны использовать == (сравнение) . б) как он может быть арбитром и основным одновременно?
4. а) Да, я изменил его на == б) есть 3 участника, поэтому в основном я просто хочу убедиться, что один из них является арбитром, а какой-то другой участник является основным.