El PID del anterior. comando en la canalización en segundo plano

El PID del anterior. comando en la canalización en segundo plano

Tengo un fragmento de guión:

MyCoolCommand 2>&1 | tail -n 256 > "report.out" &
cool_pid=$!  # FIXME

Tiene un error: cool_pides el PID de tail. La canalización se ejecuta en segundo plano. ¿Cómo guardar en el cool_pidPID de MyCoolCommand? El shell es /bin/sh. Si es imposible con el antiguo /bin/sh simple, estoy listo para cambiar a Bash si hay una manera de lograrlo.

Respuesta1

En Bash puedes usar la sustitución de procesos:

MyCoolCommand > >(tail -n 256 > report.out) 2>&1 &
cool_pid=$!

Los datos fluirán de MyCoolCommanda tailme gusta en su comando original, pero $!serán los que desee.

Notas:

  • 2>&1necesita ser después>.
  • El shell considerará el trabajo realizado justo después de MyCoolCommandsalir, mientrastailpuede que todavía esté funcionando. Si su secuencia de comandos en algún momento waites adecuada para el trabajo y luego se procesa report.outmás, tenga en cuenta que es posible que el archivo aún no esté listo. A modo de comparación: MyCoolCommand | tail … &se considera terminado despuésambossalida de procesos.

Puede resolver el problema de forma sencilla sh, pero esto requiere plomería manual:

mkfifo myfifo
<myfifo tail -n 256 >report.out &
MyCoolCommand >myfifo 2>&1 &
cool_pid=$!
rm myfifo

Notas:

  • Quitar el quince cuando todavía está en uso es seguro. Los programas seguirán usándolo, a pesar de que esté desvinculado del directorio. El sistema operativo realmente destruirá el quince sólo cuando ya no esté en uso. Un nuevo archivo con nombre myfifo(si alguna vez se crea) no tendrá nada que ver con el antiguo (excepto el nombre), incluso si el antiguo todavía está en uso.

  • Si un archivo nombrado myfifoya está en el directorio de trabajo actual (porque otra instancia del script se ejecuta en paralelo, o por cualquier motivo) y tal vez esté en uso, entonces el script puede comportarse mal. Lo correcto es crear un directorio temporal mktemp -dy colocar un quince allí. mktempno es portátil.

  • En este método puede guardar el PID deMyCoolCommand yindependientemente el PID de tail.

información relacionada