¿Cómo se pueden ejecutar múltiples programas en segundo plano con un solo comando?


36

¿Cómo se pueden ejecutar múltiples programas en segundo plano con un solo comando?

He probado los siguientes comandos, pero no funcionan.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

¿Qué es un solo "comando"? ¿Una línea de bash?
Oluf Lorenzen


Puede que me falte algo obvio, pero && implica conocer el código de salida del comando anterior. Si lo pone en segundo plano, no se conocerá el código de salida. ¿Cuál era la necesidad funcional allí?
Richlv

Respuestas:


32

Desde el punto de vista de la sintaxis de shell, &separa comandos como ;/ |/ &&... (aunque, por supuesto, con una semántica diferente). Entonces es solo:

cmd1 & cmd2 & cmd3 &

1
esto no es / bastante / correcto, ;comienza el siguiente comando tan pronto como termina el primero. &en realidad pone el comando en segundo plano. solo intenta esto:echo foo & echo bar & echo test &
Oluf Lorenzen

1
@Finkregh, por supuesto. Nadie lo duda. Simplemente quise decir que ambos comandos separados (desde el punto de vista de la sintaxis) sin implicaciones sobre cómo se ejecutan.
Stéphane Chazelas

No es exactamente lo que se pidió, ya que la pregunta especificaba la emisión de un "comando único". Tampoco es mi respuesta, ya que también es una serie de comandos, pero tiene al menos un semántico de un solo comando en que la salida se concatena, se puede redirigir, etc.
Eli Heady

Sin embargo, "múltiples comandos con un solo comando" parece ser un oxímoron. ¿Qué significa eso? Si esto es para algo sudoasí, podría ingresar la contraseña solo una vez, envolverla en bash -co similar.
Richlv

12

La sección de la página de manual de bash titulada Compound Commands tiene dos opciones que funcionarían, enumerar y agrupar comandos.

Un comando de grupo es una serie de comandos encerrados entre llaves {}. Una lista es la misma, encerrada entre paréntesis (). Ambos se pueden usar para poner en segundo plano múltiples comandos dentro y finalmente para poner en segundo plano toda la colección como un conjunto. La construcción de la lista ejecuta comandos en una subshell, por lo que las asignaciones de variables no se conservan.

Para ejecutar un grupo de comandos:

{ command1 & command2 & } &

También puede ejecutar sus comandos en una lista (subshell):

( command1 & command2 ) &

1
De nada. Agregué el enlace al manual. Tenga en cuenta que la ()sintaxis de la lista ejecuta los comandos incluidos en una subshell, por lo que las variables no se conservan dentro.
Eli Heady

3

de otra manera:

$(command1 &) && command2 & 

No, ejecutará el primer comando y luego, después de terminar primero, ejecutará otro comando
Rahul Patil el

que usó &&en su pregunta, significa que primero debe ejecutar un comando y luego, si se ejecuta con éxito, ejecute el siguiente comando. Si no lo considera, puede ejecutarcommand1 & ; command2 & ;
PersianGulf

primer comando se ejecuta correctamente en bg, o se ejecuta ;sin problemas con eso
Rahul Patil
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.