запустить программу windows под вином, используя параллели gnu

У меня есть очень простой скрипт для запуска нескольких копий программы генетики популяции Windows (msvar.exe) под Wine. Он использует «найти» для просмотра нескольких папок в поисках файла запуска (INTFILE), а затем запускает экземпляр msvar.exe в каждом каталоге, используя этот файл запуска. Разные папки будут иметь разные параметры в файле инициализации, поэтому я могу запустить серию симуляций, добавив параметр «&». Вот;

for i in $(find /home/msvartest -name INTFILE -type f)
do (
cd $(dirname $(realpath $i));
#   wine explorer /desktop=name msvar.exe;
wineconsole --backend=user msvar.exe;
) &
done

На данный момент я запускаю до 20 копий msvar.exe одновременно, каждая под своей собственной винной консолью (или окном винного проводника) на моей машине с двумя гексакорами. Каждый запуск экземпляра может занять 3 или 4 дня, но программа работает только на одном ядре, поэтому мне нужно запускать симуляции параллельно. Похоже, Gnu parallel был бы лучшим способом запуска msvar.exe и позволил бы мне запускать больше симуляций на удаленных компьютерах. Я безуспешно пытался заставить Gnu параллельно работать с wineconsole, следуя предложениям в Запускайте вино параллельно с gnu-parallel - для работы требуется замена слота {%}< /а>. Может ли кто-нибудь помочь, или, что еще лучше, сгенерировать сценарий, который я мог бы использовать.

Спасибо за вашу помощь.


person dberryman    schedule 01.08.2016    source источник
comment
Очень лестно, что вы приняли мой ответ, но на самом деле ответ от @OleTange (который является автором блестящего GNU Parallel) является более правильным - см. его комментарий под моим ответом.   -  person Mark Setchell    schedule 02.08.2016
comment
К сожалению, я не был достаточно умен, чтобы заставить работать сценарий Оле - как стыдно!!   -  person dberryman    schedule 03.08.2016


Ответы (2)


Я думаю, что ваша команда станет ужасно длинной и громоздкой, если вы не используете экспортированную функцию, подобную этой:

#!/bin/bash

doit() {
   ...
   ...
}

export -f doit
parallel -j 10 doit ::: {0..99}

Итак, для вашего примера это будет выглядеть примерно так (непроверено):

#!/bin/bash

doit() {
   echo Processing $1
   cd $(dirname $(realpath "$1"));
   WINEPREFIX=$HOME/slot{%} wineconsole --backend=user msvar.exe
}
export -f doit

find /home/msvartest -name INTFILE -type f | parallel --dry-run doit

К сожалению, у меня нет вашей среды, настроенной для проверки этого, но она должна быть близка и легко исправляться, если есть незначительные ошибки. Попробуйте и посмотрите, что он делает, а затем удалите --dry-run, чтобы он действительно что-то делал.

Если в ваших именах файлов есть пробелы, вы должны использовать -print0 с командой find, а также добавить -0 после parallel, но на данный момент это только усложняет ситуацию.

person Mark Setchell    schedule 01.08.2016
comment
{%} не заменяется в функции - только в командной строке. - person Ole Tange; 01.08.2016
comment
Фантастика, это направило меня в правильном направлении, и я даже примерно понимаю, как они работают (я биолог и знаю о программировании только достаточно, чтобы быть опасным!!). Теперь к вопросу об использовании параллельного запуска msvar.exe на удаленных серверах. Если я просто добавлю детали удаленного сервера между parallel и doit (следуя файлу справки), удаленный сервер скажет, что doit не является командой, по очевидным причинам даже для меня. Как это можно изменить, чтобы скопировать папку данных и разрешить ее запуск на удаленном сервере с установленным msvar.,exe? - person dberryman; 02.08.2016
comment
УРА! Ты тоже достиг предела моих способностей! Может быть, заставить все это работать на одном сервере, а затем задать новый вопрос о том, как распределять данные и работать на дополнительных удаленных серверах параллельно — и надеяться, что Оле все еще наблюдает, как всегда. - person Mark Setchell; 02.08.2016
comment
Ага. Начните с публикации сценария, работающего на одной машине, и давайте возьмем его оттуда. - person Ole Tange; 02.08.2016
comment
Извинения, Фантастика означает, что это сработало!! Все, что мне нужно было сделать, это изменить каталог на тот, который используется, удалить --dry-run, и все сразу заработало. This workdoit() { echo Processing $1 # cd $(dirname $(realpath $1)); cd $(dirname $(readlink -f $1)); WINEPREFIX=$HOME/slot{%} wine /home/DaveB/msvar/msvar0.4.1b/msvar.exe } export -f doit find /home/DaveB/msvar/MSVAR_ORC_NEWUPLOAD -name INTFILE -type f | параллельно - person dberryman; 03.08.2016
comment
Пожалуйста, игнорируйте скрипт выше, он был вставлен случайно. Сценарий, который работает, точно такой же, как предложил Марк, с каталогами, скорректированными для команды find. Когда я запускаю его, я получаю 20 потоков, запускающих 20 экземпляров msvar.exe — круто. Через 4 дня получу результат. У меня не получилось заставить работать сценарий Оле, но я особо и не старался. Это поможет многим из нас и сэкономит недели или месяцы времени анализа. Большое спасибо за ваши усилия. Я спрошу об удаленном исполнении в другом вопросе. - person dberryman; 03.08.2016

person    schedule
comment
Да, вы правы - как обычно. Так лучше ;-) - person Mark Setchell; 01.08.2016