Enviar comando a un proceso en segundo plano

Tengo un proceso anterior (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?

No quiero iniciar un nuevo process1.sh!

Las tuberías con nombre son tu amigo. Consulte el artículo Linux Journal: Uso de canalizaciones con nombre (FIFO) con Bash .

Si no desea limitarse a las señales, su progtwig debe admitir uno de los métodos de comunicación entre procesos. Vea el artículo correspondiente de Wikipedia .

Un método simple es hacer que escuche los comandos en un socket de dominio Unix .

Para saber cómo enviar comandos a un servidor a través de una tubería con nombre (fifo) desde el shell ver aquí:

Redireccionando la entrada de la aplicación (java) pero permitiendo stdin en BASH

¿Cómo uso exec 3> myfifo en un script, y no echo eco foo> & 3 para cerrar el conducto?

Puedes usar el coproc coproc de bash. (Disponible solo en 4.0+) – es como ksh’s |&

mira esto para ver ejemplos http://wiki.bash-hackers.org/syntax/keywords/coproc

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

Pero si está implementando este proceso o es un proceso que puede quitar los argumentos de una tubería, la otra respuesta sería de ayuda.

Basado en las respuestas:

  1. Escribiendo a stdin de proceso de fondo
  2. Acceder a la línea de comando de bash args $ @ vs $ *
  3. ¿Por qué mi línea de comando de entrada nombrada se cuelga cuando se llama?
  4. ¿Puedo redirigir el resultado a un archivo de registro y el fondo a un proceso al mismo tiempo?

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


Este primer script se ejecuta cuando la computadora se inicia. Inicia el servidor y lo configura para leer / recibir mis comandos 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 es solo un contenedor que me permite enviar comandos al servidor mi fácilmente:

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 

Ahora, cada vez que quiero enviar un comando a mi servidor, simplemente lo hago en la terminal:

 ./send.sh mp_timelimit 30 

Este script me permite seguir el proceso de la terminal actual, porque 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 abierta otra terminal abierta solo para escuchar la consola de mi servidor servidor. Para hacerlo, simplemente use el comando tail con el indicador -f para seguir la salida de mi consola del servidor:

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