
Tengo un fragmento de guión:
MyCoolCommand 2>&1 | tail -n 256 > "report.out" &
cool_pid=$! # FIXME
Tiene un error: cool_pid
es el PID de tail
. La canalización se ejecuta en segundo plano. ¿Cómo guardar en el cool_pid
PID 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 MyCoolCommand
a tail
me gusta en su comando original, pero $!
serán los que desee.
Notas:
2>&1
necesita ser después>
.- El shell considerará el trabajo realizado justo después de
MyCoolCommand
salir, mientrastail
puede que todavía esté funcionando. Si su secuencia de comandos en algún momentowait
es adecuada para el trabajo y luego se procesareport.out
má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
myfifo
ya 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 temporalmktemp -d
y colocar un quince allí.mktemp
no es portátil.En este método puede guardar el PID de
MyCoolCommand
yindependientemente el PID detail
.