¿Existe una forma más compacta de matar trabajos en segundo plano que:
for i in {1..5}; do kill %$i; done
Además, {1..5} obviamente tiene un número mágico codificado, ¿cómo puedo hacer que sea "N" con N siendo el número correcto, sin hacer un:
$(jobs | wc -l)
De hecho, uso \ j en PS1 para obtener el número de trabajos administrados, ¿es esto equivalente?

kill $(jobs -p)Parece más fácilfor pid in $(jobs -p); do kill $pid; done?jobscuales solo funciona si los trabajos se numeran consecutivamente. Ah, y "matar trabajos individualmente" no tiene sentido: pasar varios PID alkillcomando hace exactamente lo mismo que pasarlos por separado.Respuestas:
Para
killtodos los trabajos en segundo plano gestionados porbash, hagaTenga en cuenta que dado que ambos
jobsykillestán incorporados enbash, no se debe ejecutar en cualquier otro error de la lista de argumentos demasiado larga tipo.fuente
zshdescalificándolos como cualquier autoridad sobre el tema.kill %${(k)^jobdirs}, que de hecho es más largo; si necesita enumerar los PID, puede usarlos por más tiempo${${jobstates#*:*:}%%=*}.>Use en
xargslugar del$(jobs -p)subcomando, porque sijobs -pestá vacío, el comando kill fallará.fuente
jobs -p | xargs -rn10 killfuncionará mejor sijobs -pno devuelve ningún PID. Tenga en cuenta que la-ropción es la extensión GNU.-res el formato corto para la--no-run-if-emptyextensión GNUxargsque le indica que no ejecute el comando si stdin no tiene datos.Prefiero verificar si hay trabajos que existan antes de eliminarlos, de esta manera el script no fallará si no hay nada en ejecución.
También es más corto de escribir. Lanza esto en tu
.bash_profile:Entonces corre:
Para matar cualquier trabajo en ejecución.
fuente
Tengo varios comandos compuestos en segundo plano que quiero terminar con gracia, enviando SIGINT a cada proceso, en macOS. Ninguna de las otras soluciones funcionó correctamente para eso, así que se me ocurrió esto:
jobs -penumera los procesos en segundo plano iniciados por el shell actual.xargs -n1ejecuta pkill una vez para cada trabajo.pkill -SIGINT -genvía SIGINT (igual que ctrl + c) a todos los procesos en el grupo de procesos.fuente
Supongo que dependiendo de lo que
jobs -pdé la salida , la solución podría ser ligeramente diferente. En mi casoPor lo tanto, hacer lo siguiente no es bueno.
Por otro lado, la ejecución
kill $(jobs -p)sí funciona pero conlleva muchos mensajes de error, ya que las cadenas que no son PID también se pasankill.Por lo tanto, mi solución es
grepprimero el PID y luego usarlo de laxargssiguiente manera:fuente
echo $0muestra? ¿Quéhelp jobsmuestra? La salida ilustrada no es compatible con POSIX ; cualquier implementación dejobsdebería tener una-popción con el comportamiento deseado.jobs -psolo hice salir PID. Acabo de enterarme de que zsh no es completamente compatible con POSIX.Parece que
jobs -p | xargs killhace el trabajo, sin embargo, produce una salida no deseada canalizada para matar. Aquí estoy agrupando la salida dejobs -ptener / no tener + o - carácterY luego puedes llamar
killjobsfuente