copythreshold = 1024
Затем унисон изменяет файлы, больше, чем 1 МБ на месте с помощью rsync
вместо завершенной перепередачи.
Отбросьте ;
после &
. Это - синтаксическое требование
for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Учитывая комментарий Stephane 1_CR's ответ, Вы, вероятно, хотите:
for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done
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
<=
в исходном вопросе, таким образом, диапазон Вы предоставили, полностью подходило на основе информации, которую я предоставил. Еще раз спасибо за другой подход
– ljs.dev
21.09.2013, 04:26
Проиграйте ;
:
for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Как указано в других ответах:
;
после &
. ;
после &
приведет к появлению команды который будет работать без синтаксических ошибок оболочки. Однако вряд ли он будет работать корректно, потому что это создает состояние гонки. ОП заявил, что решил проблему гонки, добавив 3-секундную задержку.
Никто не упоминал:
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
лучше защитного программирования чем A; B
. Но это, вероятно, не идеальный способ справиться с этой ситуацией. Если 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"
.
numbers.txt
содержа255
. – Stéphane Chazelas 20.09.2013, 22:36