Чтение вывода с экрана

Мое awk-решение (с использованием выходных форматов от Романа Перехреста ). По сути, есть две соответствующие петли. Во-первых, если для пользователя обрабатывается новый супервизор, то пользователю должны быть добавлены все зависимости этого супервизора (, т.е. цепочки супервизора -). После этого второй цикл ищет всех остальных пользователей, у которых в качестве зависимости есть текущий обрабатываемый пользователь, и к ним добавляются все зависимости текущего пользователя.:

#!/usr/bin/awk
# file process_it.awk
BEGIN {

    FS="|";
}

NR<3 {

    h=(h==""? $0 : h ORS $0)
}

NR>2 {

   gsub(/ /, "", $0)
   curr_user=$1;
   curr_supervisor=$2;
   curr_id=$3;
   print curr_user, curr_supervisor;
   arr[curr_user][curr_supervisor]++;
   id[curr_user]=curr_id;

   if(isarray(arr[curr_supervisor])) {
       for(sub_indx in arr[curr_supervisor])
           arr[curr_user][sub_indx]++;
    }
    else
        delete arr[curr_supervisor];

    for(indx in arr) {

        if(isarray(arr[indx])) {

            for(sub_indx in arr[indx]) {

                if(sub_indx==curr_user) {

                    for(sub_indx2 in arr[curr_user])
                    arr[indx][sub_indx2]++;
                }
            }    
        }
    }
}

END {
    print h;

    for(i in arr) {

        if(isarray(arr[i])) {

            for(j in arr[i])
                printf "%-5s|%-11s|%-3s\n", i, j, id[i];
        }
    }
}

Используйте:

awk -f process_it.awk your_file.txt
0
23.09.2019, 15:17
1 ответ

Я не думаю, что это возможно в screen. Вы можете использовать fifo, чтобы получить вывод команды на экране , но я сомневаюсь, что «оболочка Minecraft» это поддержит.

Однако это «выполнимо» с помощью tmux.

Состояние процесса/трассировка стека

Трассировка стека

Чтобы заставить его работать правильно, вам нужно определить, в какой момент программа, которой вы передаете команды, зависла в соответствующей операции ввода-вывода. Способ сделать это - запустить трассировку стека и найти это. См. также :. Как определить, запущена ли команда или ожидает ввода данных пользователем? .

Это может быть немного сложно, потому что он может временно застрять на другом readперед желаемым. Это также может потребовать некоторых догадок, основанных на том, как долго он застрял и на каком файловом дескрипторе. Его можно комбинировать с приведенным ниже предложением по подсчету строк -для большей точности.

Редактировать Во время тестирования я столкнулся с интерпретаторомread(10, (zshselect(1, [0], NULL, NULL, NULL (python3cli ). Может быть несколько других возможностей, поэтому я не ограничивал RegExв приведенном ниже скрипте только этим. Сейчас он просто ищет открытую скобку. Может быть, кто-то знает более точный способ сделать это?

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

Подсчет строк

Если сервер работает как Child Processв Node, вы можете взаимодействовать с stdinи stdoutпроцесса в Node. Вы можете просто искать новые строки (\n), и если вы знаете, сколько строк должно быть на выходе,вы можете подсчитать их и «узнать», что он закончил работу и снова ожидает ввода. Вы можете совместить это с тайм-аутом.


Доказательство концепции со статусом процесса/трассировкой

Я переместил скрипт и некоторую документацию в репозиторий github . Я не проверял это с mc, но это работало с python3и zsh(. Насколько я мог это проверить, см. раздел «Тесты» ). Это все еще не идеально, так как все еще требует некоторого ожидания и может дать или не получить ложные срабатывания.

Как использовать

Вы можете запустить сервер/tmuxсессию так:

tmux new-session -d -s server_name "java -jar minecraft_server.jar"

Отправка команды на сервер будет выглядеть так:

./trun.sh -s server_name -c "the command"

Должен возвращаться вывод сервера. Возможно, вам придется отрегулировать параметры -Hи -T.


Синхронность

Имейте в виду, что если вы запустите это на веб-сервере, вы можете столкнуться с проблемами, особенно если есть несколько пользователей. Возможно, вам придется реализовать блокировку , чтобы предотвратить одновременный доступ нескольких пользователей к оболочке. Я уверен, что у самого tmuxне было бы проблем с этим, но вы не можете действительно предсказать вывод, если другая команда могла быть запущена, пока вы пытаетесь прочитать указанный вывод.

Безопасность

Если вы собираетесь запускать это на сервере с доступом к www, рассмотрите возможность его защиты (, например, с помощью защищенного паролем прокси-сервера через apacheилиnginx).

0
28.01.2020, 03:15

Теги

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