Почему моя входная командная строка именованного канала просто зависает, когда она вызывается?

Почему моя входная командная строка именованного канала просто зависает, когда она вызывается?

На основании ответов:

  1. Запись в stdin фонового процесса
  2. Доступ к аргументам командной строки bash $@ vs $*
  3. Отправить команду в фоновый процесс
  4. Можно ли перенаправить вывод в файл журнала и одновременно запустить процесс в фоновом режиме?

Я написал два сценария оболочки для связи с моим игровым сервером. И работал в первый раз, когда я это сделал. Так как они больше не работают. Каждый раз, когда я делаю ./send.sh commands командная строка зависает, пока я не нажму Ctrl+C,

Он также зависает и ничего не делает, когда я делаю напрямую echo commamd > /tmp/srv-input


Сценарии

Он запускает сервер и настраивает его на чтение / получение моих команд, пока он работает в фоновом режиме:

start_czero_server.sh

#!/bin/sh

# Go to the game server application folder where the game application `hlds_run` is
cd /home/user/Half-Life
pkill -f hlds

# Set up a pipe named `/tmp/srv-input`
rm /tmp/srv-input
mkfifo /tmp/srv-input

cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid

# Start the server reading from the pipe named `/tmp/srv-input`
# And also output all its console to the file `/home/user/Half-Life/my_logs.txt`
cat /tmp/srv-input | ./hlds_run -console -game czero +port 27015 > my_logs.txt 2>&1 &

# Successful execution 
exit 0

Этот второй скрипт это просто оболочка, которая позволяет мне легко отправлять команды на мой сервер:

send.sh

#!/bin/sh
echo "$@" > /tmp/srv-input

# Successful execution 
exit 0

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

./send.sh mp_timelimit 30

Я всегда держу другой открытый терминал открытым только для прослушивания консоли моего сервера. Для этого просто используйте tail команда с -f флаг, чтобы следовать за выводом моей консоли сервера:

./tail -f /home/user/Half-Life/my_logs.txt

1 ответ

Решение

Вам было бы лучше, если бы hlds_run читать прямо из трубы вместо того, чтобы иметь cat трубка это.

Пытаться

./hlds_run … > my_logs.txt 2>&1 < /tmp/srv-input &

Вместо

cat /tmp/srv-input | ./hlds_run …
Другие вопросы по тегам