2011-05-13 19 views
14

Tengo un proceso que se ejecuta previamente (process1.sh) que se ejecuta en segundo plano con un PID de 1111 (o algún otro número arbitrario). ¿Cómo podría enviar algo como command option1 option2 a ese proceso con un PID de 1111?Enviar comando a un proceso en segundo plano

I no quiero comenzar un nuevo process1.sh!

Respuesta

12

Canalizaciones con nombre son su amigo. Ver el artículo Linux Journal: Using Named Pipes (FIFOs) with Bash.

+0

El artículo es grande, pero un ¿cómo podría enviar el "algo yetanotherthing somethingelse" al proceso? Por ejemplo, tengo un servidor en ejecución que acepta "algo" y hace algo con él. ¿Cómo podría hacer esto? –

1

no puede enviar nuevos argumentos a un proceso en ejecución.

Pero si está implementando este proceso o es un proceso que puede tomar las args de una tubería, entonces la otra respuesta ayudaría.

+0

Incorrecto, puede usar un tubo con nombre para este tipo de cosas. –

+0

@mu para mí la pregunta dice que el usuario quiere obtener nuevos argumentos (argc/argv en C o params posicionales en bash). Una vez que el programa comienza, no puedes darle nuevos argumentos. Pipes puede resolver su problema si fue el autor de la aplicación. También podría implementar un servidor TCP ... pero si está hablando de un comando existente, entonces no (si lo hubiera dicho, estoy escribiendo esta aplicación que quiero ejecutar en el bg ....) – nhed

+0

Hay cierta ambigüedad en la pregunta, pero no leí "enviar algo como 'comando opción1 opción2'" para significar la modificación de 'argv' después del hecho, me parece que Mohit solo quiere enviar un mensaje de algún tipo a un guión de shell . –

1

Sobre la base de las respuestas:

  1. Writing to stdin of background process
  2. Accessing bash command line args [email protected] vs $*
  3. Why my named pipe input command line just hangs when it is called?
  4. Can I redirect output to a log file and background a process at the same time?

Escribí dos scripts de shell para comunicarme con mi servidor de juegos.


Este primer script se ejecuta cuando se inicia la computadora. Lo hace iniciar el servidor y configurarlo para leer/recibir mis órdenes mientras se ejecuta en segundo plano:

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 

Esta segunda secuencia de comandos que sólo un envoltorio que me permitirá fácilmente para enviar comandos al servidor my:

enviar.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 "[email protected]" > /tmp/srv-input 
sleep 1 

exit 0 

Ahora cada vez que desee enviar un comando al servidor acabo de hacer en el terminal:

./send.sh mp_timelimit 30 

Esta escritura me permite mantener tizón del proceso es posible que la terminal actual, ya cada vez que envío un comando, comprueba si hay un proceso de cola ejecutándose en segundo plano. Si no, solo comienza una y cada vez que el proceso envía salidas, puedo verlo en el terminal que usé para enviar el comando, al igual que para las aplicaciones que ejecuta al agregar el operador &.


Siempre puede mantener abierto otro terminal abierto solo para escuchar la consola de mi servidor servidor. Para hacerlo sólo tiene que utilizar el comando tail con la bandera -f seguir mi servidor de salida de la consola:

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