Почему моя входная командная строка именованного канала просто зависает, когда она вызывается?
Почему моя входная командная строка именованного канала просто зависает, когда она вызывается?
На основании ответов:
- Запись в stdin фонового процесса
- Доступ к аргументам командной строки bash $@ vs $*
- Отправить команду в фоновый процесс
- Можно ли перенаправить вывод в файл журнала и одновременно запустить процесс в фоновом режиме?
Я написал два сценария оболочки для связи с моим игровым сервером. И работал в первый раз, когда я это сделал. Так как они больше не работают. Каждый раз, когда я делаю ./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 …