¿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
?jobs
cuales solo funciona si los trabajos se numeran consecutivamente. Ah, y "matar trabajos individualmente" no tiene sentido: pasar varios PID alkill
comando hace exactamente lo mismo que pasarlos por separado.Respuestas:
Para
kill
todos los trabajos en segundo plano gestionados porbash
, hagaTenga en cuenta que dado que ambos
jobs
ykill
están incorporados enbash
, no se debe ejecutar en cualquier otro error de la lista de argumentos demasiado larga tipo.fuente
zsh
descalificá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
xargs
lugar del$(jobs -p)
subcomando, porque sijobs -p
está vacío, el comando kill fallará.fuente
jobs -p | xargs -rn10 kill
funcionará mejor sijobs -p
no devuelve ningún PID. Tenga en cuenta que la-r
opción es la extensión GNU.-r
es el formato corto para la--no-run-if-empty
extensión GNUxargs
que 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 -p
enumera los procesos en segundo plano iniciados por el shell actual.xargs -n1
ejecuta pkill una vez para cada trabajo.pkill -SIGINT -g
envía SIGINT (igual que ctrl + c) a todos los procesos en el grupo de procesos.fuente
Supongo que dependiendo de lo que
jobs -p
dé 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
grep
primero el PID y luego usarlo de laxargs
siguiente manera:fuente
echo $0
muestra? ¿Quéhelp jobs
muestra? La salida ilustrada no es compatible con POSIX ; cualquier implementación dejobs
debería tener una-p
opción con el comportamiento deseado.jobs -p
solo hice salir PID. Acabo de enterarme de que zsh no es completamente compatible con POSIX.Parece que
jobs -p | xargs kill
hace el trabajo, sin embargo, produce una salida no deseada canalizada para matar. Aquí estoy agrupando la salida dejobs -p
tener / no tener + o - carácterY luego puedes llamar
killjobs
fuente