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

Ваша проблема в том, что usr является унифицированным, и при первом проходе по циклу usr не равен $1, поэтому вы печатаете линию.

Можно добавить блок BEGIN к коду awk:

BEGIN { usr = blank }

, а затем, внутри внутреннего if, проверить это условие перед печатью:

...
{ if (usr != $1)  {                                                                                     
    if (usr != blank) { printf("%s\t%d\t%s\n",usr, num, tim); }                              
    usr = $1;                                                                               
    num = 1 }    
...
1
04.10.2014, 19:15
2 ответа

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

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

screen -md ./runMyJob.sh

Если вы хотите облегчить работу, вы можете пройти вариант -S , чтобы установить имя сеанса.

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

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

Вызовите его что-то вроде Отправить , поставить его в каталог на вашем пути ( Однопользовательская бинарная установка? и и Как добавить путь к главному каталогу, который должен быть обнаружен с помощью Unix, какую команду? может помочь), сделайте его исполняемым ( chmod + x ~ / Bin / Отправить ). Чтобы начать работу, запустить

submit ./runMyJob.sh

для параллельного исполнения, вы можете расследовать GNU Parallel .

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

2
27.01.2020, 23:38

введите , Ctrl - А и d d генерируют нормальные коды ASCII.

Таким образом, возможное решение может быть программой, которая создает неназванную трубу ( () ), затем Fork () Детский процесс, который сначала связывает конечный конец трубы К своему стандартному входу, затем выполнение экрана в дочернем процессе ( Execive () или аналогичный). Если эта программа запускается, вы можете написать командные строки, необходимые для начала процесса для записи запуска созданной трубы.

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

== Редактировать ==

для Linux (или, может быть, некоторые ООН * 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 C-a!
                              */
    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;
}

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

0
27.01.2020, 23:38

Теги

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