Бесконечный цикл для ожидания изменения значения переменной и проверки каждые 30 секунд в оболочке mongo

#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 участника, поэтому в основном я просто хочу убедиться, что один из них является арбитром, а какой-то другой участник является основным.