Основано на ответах:
- Запись в stdin фонового процесса
- Доступ к аргументам командной строки bash $ @ vs $ *
- Почему моя командная строка ввода именованного канала просто зависает при ее вызове?
- Могу ли я перенаправить вывод в файл журнала и создать фоновый процесс вв то же время?
Я написал два сценария оболочки для связи с моим игровым сервером.
Этот первый скрипт запускается при запуске компьютера.Он запускает сервер и настраивает его для чтения / получения моих команд, пока он работает в фоновом режиме:
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
# Set up a pipe named `/tmp/srv-input`
rm /tmp/srv-input
mkfifo /tmp/srv-input
# To avoid your server to receive a EOF. At least one process must have
# the fifo opened in writing so your server does not receive a EOF.
cat > /tmp/srv-input &
# The PID of this command is saved in the /tmp/srv-input-cat-pid file
# for latter kill.
#
# To send a EOF to your server, you need to kill the `cat > /tmp/srv-input` process
# which PID has been saved in the `/tmp/srv-input-cat-pid file`.
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`
#
# Replace the `./hlds_run -console -game czero +port 27015` by your application command
./hlds_run -console -game czero +port 27015 > my_logs.txt 2>&1 < /tmp/srv-input &
# Successful execution
exit 0
Этот второй скриптэто просто оболочка, которая позволяет мне легко отправлять команды на мой сервер:
send.sh
half_life_folder="/home/jack/Steam/steamapps/common/Half-Life"
half_life_pid_tail_file_name=my_logs_tail_pid.txt
half_life_pid_tail="$(cat $half_life_folder/$half_life_pid_tail_file_name)"
if ps -p $half_life_pid_tail > /dev/null
then
echo "$half_life_pid_tail is running"
else
echo "Starting the tailing..."
tail -2f $half_life_folder/my_logs.txt &
echo $! > $half_life_folder/$half_life_pid_tail_file_name
fi
echo "$@" > /tmp/srv-input
sleep 1
exit 0
Теперь каждый раз, когда я хочу отправить командумой сервер я просто делаю на терминале:
./send.sh mp_timelimit 30
Этот скрипт позволяет мне следить за процессом, который вы можете использовать на текущем терминале, потому что каждый раз, когда я отправляю команду, он проверяет, запущен ли хвостовой процесс вфон.Если нет, он просто запускается один раз и каждый раз, когда процесс отправляет выходные данные, я вижу его на терминале, который использовал для отправки команды, так же, как и для приложений, которые вы запускаете, добавляя оператор &
.
Вы всегда можете оставить другой открытый терминал открытым только для прослушивания консоли моего сервера.Для этого просто используйте команду tail
с флагом -f
, чтобы следовать выводу консоли моего сервера:
./tail -f /home/user/Half-Life/my_logs.txt