Мое 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
Я не думаю, что это возможно в screen
. Вы можете использовать fifo, чтобы получить вывод команды на экране , но я сомневаюсь, что «оболочка Minecraft» это поддержит.
Однако это «выполнимо» с помощью tmux
.
Трассировка стека
Чтобы заставить его работать правильно, вам нужно определить, в какой момент программа, которой вы передаете команды, зависла в соответствующей операции ввода-вывода. Способ сделать это - запустить трассировку стека и найти это. См. также :. Как определить, запущена ли команда или ожидает ввода данных пользователем? .
Это может быть немного сложно, потому что он может временно застрять на другом read
перед желаемым. Это также может потребовать некоторых догадок, основанных на том, как долго он застрял и на каком файловом дескрипторе. Его можно комбинировать с приведенным ниже предложением по подсчету строк -для большей точности.
Редактировать Во время тестирования я столкнулся с интерпретаторомread(10,
(zsh
)иselect(1, [0], NULL, NULL, NULL
(python3
cli ). Может быть несколько других возможностей, поэтому я не ограничивал 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
).