Автоматизировать запуск нескольких параллельных потоков экрана?

В нашей школе HPC нет планировщика. Таким образом, нет ничего похожего на очередь заданий. Следовательно, я не могу автоматизировать параллельное представление задания qsub или sbatch .

То, что я использовал для «отправки» задания, – это экран экрана: тип, затем нажмите « Ввод» , затем введите ./runMyJob.sh , затем нажмите CTRL + a, а затем d, чтобы отсоединить.

Теперь я хочу автоматизировать / запустить процесс запуска нескольких сеансов параллельного экрана, затем выполнить задание в каждом сеансе и, наконец, отсоединить все сеансы экрана.

Как вы можете видеть, во время ручных операций я нажал Enter и CTRL + a, а затем d . Как мне выполнить эти операции нажатия клавиш?

PS: любое предложение, которое помогает достичь параллельной подачи задания в HPC без планировщика, очень приветствуется!

2 Solutions collect form web for “Автоматизировать запуск нескольких параллельных потоков экрана?”

Не думайте об этом с точки зрения нажатия клавиш, подумайте об этом с точки зрения выполнения задачи. Нажатие клавиш – это способ сделать что-то интерактивно. Путь к выполнению вещей автоматически – это сценарий.

Чтобы запустить работу на экране и немедленно отделить ее, запустите

 screen -md ./runMyJob.sh 

Если вы хотите упростить работу, вы можете передать опцию -S для установки имени сеанса.

Например, вы можете написать следующий скрипт, который использует имя исполняемого файла задания как имя сеанса:

 #!/bin/sh screen -md -S "${1##*/}" "$@" 

Назовите это что-то вроде submit , поместите его в каталог на вашем PATH ( однопользовательское двоичное место установки и как добавить путь к домашней директории, который будет обнаружен Unix, какая команда может помочь), сделать его исполняемым ( chmod +x ~/bin/submit ). Чтобы начать работу, запустите

 submit ./runMyJob.sh 

Для параллельного выполнения вы можете изучить параллель GNU .

Обратите внимание, что в структуре представления заданий больше заданий запуска. Он также организует их запуск там, где есть время и память процессора, и отправка журналов отправителям. Вы должны запросить, чтобы ваши администраторы создали надлежащую структуру подачи заявок.

Введите , Ctrla и d сгенерируют нормальные коды ASCII.

Таким образом, возможным решением может быть программа, которая создает неназванный канал ( pipe() ), а затем fork() дочерний процесс, который сначала связывает считываемый конец канала с его стандартным входом, а затем выполняет screen в дочернем процессе ( execve() или аналогичные). Если эта программа запущена, вы можете написать командные строки, необходимые для запуска процесса на конец записи созданного канала.

То, как вы ставите задачи в эту программу, – это еще одна тема. Например, вы можете написать небольшой планировщик (что-то вроде очереди заданий и некоторого кода, который запускает не более N процессов параллельно).

== EDIT ==

Для Linux (или, может быть, UN * Xes тоже) программа может выглядеть следующим образом:

 #include <sys/types.h> #include <sys/linux.h> #include <unistd.h> int main(void) { int fds[2] = {0}; pid_t pid = 0; pipe(fds); /* Creates an unnamed pipe */ pid = fork(); /* Forks a new process */ if (pid == 0) { static char const *argv[] = {"/usr/bin/screen", NULL}; /* Note: The array might need to be changed, * depending on your requirements * (eg. command-line arguments) */ dup2(fds[0], stdin); /* Binds the read end of the pipe to stdin */ execve(argv[0], argv, NULL); /* If you reach this point, your execve() failed */ } sleep(1); /* Waits for the child process to execute * screen */ char const data[] = "./MyJob.sh\n\x00d"; /* Note: You must replace the '\x00' by the * ASCII code of Ca! */ write(fds[1], data, sizeof(data)); /* Writes the name of the job along with the * control codes to the child process */ int retcode = 0; waitpid(pid, &retcode, 0); /* Waits for the child process to terminate */ /* Note: WEXITSTATUS(retcode) gets the exit * status of the child process */ return 0; } 

Эта программа должна проиллюстрировать идею, ей не хватает необходимой обработки ошибок.

  • Как я могу регистрировать все сеансы экрана
  • Настройка экрана экрана GNU по умолчанию "экраны"
  • восстановить сеанс сеанса ожидания в режиме FreeBSD
  • Отображать содержимое всего экрана в данный момент
  • Как установить небуферизованный ввод-вывод в `screen`?
  • Запустить сеанс сеанса с более чем 80 столбцами?
  • Экран GNU mimic emacs frameset-to-register путем написания макета в файл
  • Объединение двух сеансов экрана
  • Выберите экран в сеансе отдельного экрана
  • Может показывать на экране nl (новая строка) для каждого (возврат каретки)
  • Присоединить несколько раз к сеансу одного экрана
  • Linux и Unix - лучшая ОС в мире.