Отправить команду в фоновый процесс

У меня есть ранее запущенный процесс (process1.sh), который работает в фоновом режиме с PID 1111 (или некоторым другим произвольным числом). Как я могу отправить что-то вроде command option1 option2 в этот процесс с PID 1111?

Я не хочу запускать новый файл process1.sh!

Ответы

Ответ 2

Если вы не хотите ограничиваться сигналами, ваша программа должна поддерживать один из методов Inter Process Communication. См. соответствующую статью в Википедии.

Простым методом является заставить его прослушивать команды на Unix-домене.

Ответ 5

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

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

Я написал два сценария оболочки для связи с моим игровым сервером.


Этот первый скрипт запускается при запуске компьютера. Он запускает сервер и настраивает его для чтения/получения моих команд, пока он работает в фоновом режиме:

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

Ответ 6

вы не можете отправлять новые аргументы в выполняемый процесс.

Но если вы реализуете этот процесс или его процесс, который может принимать аргументы из трубы, то другой ответ поможет.