Использование и (амперсанд) в одной строке колотят цикл

copythreshold = 1024

Затем унисон изменяет файлы, больше, чем 1 МБ на месте с помощью rsync вместо завершенной перепередачи.

59
20.09.2013, 22:25
4 ответа

Отбросьте ; после &. Это - синтаксическое требование

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
89
27.01.2020, 19:33
  • 1
    COASt Черт побери, 43 секунды также замедляют :) –  Martin von Wittich 20.09.2013, 22:35
  • 2
    @MartinvonWittich, +1 к Вашему ответу посредством сочувствия ;-) –  iruvar 20.09.2013, 22:36
  • 3
    , В то время как это отвечает на вопрос, это, вероятно, не, что OP хочет как, к тому времени, когда все экземпляры Python запустились, и инициализирует, они будут все видеть a numbers.txt содержа 255. –  Stéphane Chazelas 20.09.2013, 22:36
  • 4
    Согласованный с @StephaneChazelas, но не уверено, что мы можем действительно делать с этим с информацией, данной в вопросе. Для надлежащего решения того, вероятно, нужно больше контекста. –  a CVn 20.09.2013, 22:37
  • 5
    Вот ссылка на руководство удара: gnu.org/software/bash/manual/bashref.html#Lists –  glenn jackman 21.09.2013, 02:38

Учитывая комментарий Stephane 1_CR's ответ, Вы, вероятно, хотите:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
14
27.01.2020, 19:33
  • 1
    Спасибо Glenn. Я попробовал несколько изменений Вашего кода, который я люблю из-за увеличенной удобочитаемости, но возможно из-за дополнительного сна мне было нужно, это не удавалось для меня. Это также повторило бы последнее число в for диапазон... Вот то, чем я доволен в данный момент: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & done Основная точка вопроса того, чтобы заставлять процесс выполниться в фоновом режиме решена. –  ljs.dev 21.09.2013, 04:21
  • 2
    *, конечно, я имел <= в исходном вопросе, таким образом, диапазон Вы предоставили, полностью подходило на основе информации, которую я предоставил. Еще раз спасибо за другой подход –  ljs.dev 21.09.2013, 04:26

Проиграйте ;:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
10
27.01.2020, 19:33

Как указано в других ответах:

  • Проблема заключается в ;после &.
  • Удаление ;после &приведет к появлению команды который будет работать без синтаксических ошибок оболочки. Однако вряд ли он будет работать корректно, потому что это создает состояние гонки.

ОП заявил, что решил проблему гонки, добавив 3-секундную задержку.

Никто не упоминал:

  • Сегодня может работать трехсекундная задержка. Завтра компьютер может работать более вяло, и он снова может выйти из строя. В следующем году сценарий может быть изменен, чтобы он -занимал больше времени, а может опять не получиться. Вероятность отказа снижается, если вы увеличиваете задержку на порядок величины, под которой я подразумеваю 30 секунд. Конечно, это означает, что процессы скрипта будут (возможно / предположительно )выполняться по существу последовательно, а не одновременно (параллельно ), тем самым нарушая цель сделать процессы асинхронными.
  • Если требуется запуск нескольких экземпляров скрипта, вероятно, лучше изменить скрипт, чтобы он принимал числовой параметр в командной строке :
    for ((i=114;i<=255;i++)); do python DoMyScript.py --number="$i" & done
    
    и покончить с файлом.
  • Если изменение сценария невозможно, это решение должно работать :
    for i in {114..125}; do ( subdir="dir.$i" && mkdir "$subdir" && cd "$subdir" && 
              echo "$i" > numbers.txt && python../DoMyScript.py; cd.. && rm -r "$subdir" ) & done
    
    Это дает каждому процессу сценария отдельный файл numbers.txt, предоставив ему отдельный каталог для запуска. Каталог создается и удаляется, а скрипт запускается,в подоболочке.
    • Если DoMyScript.pyобращается к любым файлам, кроме numbers.txtпо относительным путям, вышеуказанная команда должна быть скорректирована, чтобы приспособиться к этому.

    • Вышеизложенное было вдохновлено ответом Гленна Джекмана (хотя я верю, что мой сработает, а его нет ).

    • Если командаBзависит от успеха команды A, тогда A && Bлучше защитного программирования чем AB. Но это, вероятно, не идеальный способ справиться с этой ситуацией. Если mkdir dir.114не удается, то следующие 111 попыток, скорее всего, также не увенчаются успехом. и вы получите 112 сообщений об ошибках. Было бы лучше прервать цикл, если произойдет фатальная ошибка.

      Тот факт, что действие происходит в асинхронной подоболочке делает это несколько сложным.

      for i in {114..125}; do
              { subdir="dir.$i" && mkdir "$subdir" && echo "$i" > "$subdir"/numbers.txt; } || break;
              ( cd "$subdir" && python../DoMyScript.py; cd.. && rm -r "$subdir" ) & done
      

      вызовет прерывание цикла, если mkdirили команда  echo value > fileзавершается ошибкой.

    • Возможно, лучше работать в каталоге что «гарантировано» доступно для записи, например /tmp. Однако это увеличивает риск того, что ваша команда будет сталкиваться (мешать )какому-то другому процессу.

      • Вы можете смягчить это, добавив $$к имени каталога; например, dir.$$.$iили даже dir.$BASHPID.
      • Это не устранит риск того, что mkdirили сбой при создании файла из-за переполнения файловой системы.
    • Обратите внимание, что приведенный выше код будет продолжать работать. и удалить временный каталог, даже если скрипт не работает. Возможно, вы захотите сделать что-то еще в этой ситуации.

      • Ой. Если по какой-то причине mkdir "$subdir"удается, но cd "$subdir"терпит неудачу, это будет продолжаться и делать cd .. && rm -r "$subdir". Если в вашем родительском каталоге есть каталог с именем вроде dir.114(т. е. параллельно вашему текущему каталогу ),он будет удален. Я считаю, что вы можете (хоть немного )исправить это изменив последнюю строку на
        ( cd "$subdir" && { python../DoMyScript.py; cd..; } && rm -r "$subdir" ) & done
        
        или используя абсолютные пути; например, subdir="$PWD/dir.$i".
6
20.08.2021, 13:05

Теги

Похожие вопросы