Ответ 1
Именованные трубы - ваш друг. См. Статью Журнал Linux: использование именных каналов (FIFO) с Bash.
У меня есть ранее запущенный процесс (process1.sh), который работает в фоновом режиме с PID 1111 (или некоторым другим произвольным числом). Как я могу отправить что-то вроде command option1 option2
в этот процесс с PID 1111?
Я не хочу запускать новый файл process1.sh!
Именованные трубы - ваш друг. См. Статью Журнал Linux: использование именных каналов (FIFO) с Bash.
Если вы не хотите ограничиваться сигналами, ваша программа должна поддерживать один из методов Inter Process Communication. См. соответствующую статью в Википедии.
Простым методом является заставить его прослушивать команды на Unix-домене.
Как отправить команды на сервер через именованный канал (fifo) из оболочки, см. здесь:
Перенаправление ввода приложения (java), но все же позволяющий stdin в BASH
Как использовать exec 3 > myfifo в script и не иметь echo foo > & 3 закрыть трубу?
Вы можете использовать commnd bash coproc
. (доступен только в 4.0+) - он похож на ksh |&
проверьте это для примеров http://wiki.bash-hackers.org/syntax/keywords/coproc
На основании ответов:
Я написал два сценария оболочки для связи с моим игровым сервером.
Этот первый скрипт запускается при запуске компьютера. Он запускает сервер и настраивает его для чтения/получения моих команд, пока он работает в фоновом режиме:
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=hlds_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 "[email protected]" > /tmp/srv-input
sleep 1
exit 0
Теперь каждый раз, когда я хочу отправить команду на свой сервер, я просто делаю на терминале:
./send.sh mp_timelimit 30
Этот скрипт позволяет мне следить за процессом, который вы можете использовать на текущем терминале, потому что каждый раз, когда я отправляю команду, он проверяет, работает ли хвостовой процесс в фоновом режиме. Если нет, он просто запускается один раз и каждый раз, когда процесс отправляет выходные данные, я вижу его на терминале, который использовал для отправки команды, так же, как и для приложений, которые вы запускаете, добавляя оператор &
.
Вы всегда можете оставить другой открытый терминал открытым только для прослушивания консоли моего сервера. Для этого просто используйте команду tail
с флагом -f
, чтобы следить за выводом консоли моего сервера:
./tail -f /home/user/Half-Life/my_logs.txt
вы не можете отправлять новые аргументы в выполняемый процесс.
Но если вы реализуете этот процесс или его процесс, который может принимать аргументы из трубы, то другой ответ поможет.