scripts script resueltos programas pasar parametros español ejercicios ejemplos comandos linux shell process process-group

linux - resueltos - Cómo configurar el grupo de proceso de un script de shell



scripts linux ejercicios resueltos (6)

¿Cómo configurar el grupo de proceso de un script de shell? También quiero que todo el proceso hijo esté en el mismo grupo de procesos.

Espero algo similar a setpgid () en C.


Aquí hay una síntesis tardía, tomada de varias otras buenas respuestas aquí, si su intención es limpiar cualquier proceso de subshell generado (incluso si el script en sí no se inicia directamente desde un shell interactivo, sino desde otro proceso, y por lo tanto no se convierte automáticamente su propio líder de grupo de procesos ), relanzando el script actual como un nuevo líder de grupo de procesos si es necesario.

# First, obtain the current PGID, by parsing the output of "ps". pgid=$(($(ps -o pgid= -p "$$"))) # Check if we''re already the process group leader; if not, re-launch ourselves. # Use setsid instead of set -m (...) to avoid having another subshell in between. This helps that the trap gets executed when the script is killed. [ $$ -eq $pgid ] || exec setsid "${BASH_SOURCE[0]}" "$@" # Kill any subshell processes when the script exits. trap "kill -- -$pgid" EXIT # Note: If the script only starts background jobs, and that''s all you care about, you can replace all of the above with this simple trap: #trap "jobs -p | xargs kill --" EXIT # Kill remaining jobs when the script exits.


Como @Rob Davis señaló en su respuesta , establecer el grupo de proceso no es lo que se desea para las carcasas.

En su lugar, desea utilizar sus mecanismos de control de procesos. Esta respuesta cubre hacer esto por sh en linux y borne . En breve:

#! /bin/sh # Kill all opened jobs on exit. trap ''kill $(jobs -p)'' EXIT

Esto eliminará cualquier trabajo abierto en segundo plano (por ejemplo, con & ).


Como señala PSkocik , es posible ejecutar un proceso en su propio grupo de procesos, en la mayoría de los shells, activando el control del trabajo ("modo monitor").

(set -m; exec process_in_its_own_group)

Linux tiene una utilidad setsid , que ejecuta el comando pasado como argumento en su propia session (usando la llamada del sistema del mismo nombre ). Esto es más fuerte que ejecutarlo en su propio grupo de procesos à la setpgrp , pero puede estar bien para su propósito.

Si desea ubicar el proceso en un grupo existente en lugar de hacerlo en su propio grupo (es decir, si desea tener todo el poder de setpgid ), no hay una utilidad de shell común. Tienes que usar C / Perl / ...


Contestaré parte de lo que entiendo:

Cómo forzar el script de shell bash actual para que sea un grupo de proceso propio:

Puse esto al principio de mi guión de bash:

setpgrp(0, 12345) || die "$!"

¿Por qué necesitaría esto?

Al iniciar un programa desde una sesión de bash interactiva , obtiene su propio nuevo grupo de procesos. Pero este no es el caso si su programa se llama desde un script bash (no interactivo). Si su programa se basa en ser el propietario del grupo de procesos en ambas condiciones, necesitará esto.


No creo que Bourne, bash o zsh te permitan hacerlo, pero puedes hacerlo en perl usando el setpgrp (nota la ligera diferencia de nombre de POSIX). Pase cero como el PID para modificar el grupo del propio proceso perl:

pgid_from_pid() { local pid=$1 ps -o pgid= "$pid" 2>/dev/null | egrep -o "[0-9]+" } pid="$$" if [ "$pid" != "$(pgid_from_pid $pid)" ]; then exec setsid "$(readlink -f "$0")" "$@" fi

Podría pensar que podría usar perl desde, por ejemplo, bash para establecer el grupo del proceso de bash (al pasar $$ a un script de perl, por ejemplo), pero no creo que el proceso de perl pueda modificar el grupo de un Proceso que no se bifurca.

Dependiendo de lo que intente hacer, las funciones de control del trabajo en varios shells pueden brindarle lo que necesita, de una manera diferente, como si solo desea separarse del terminal.

ACTUALIZACIÓN: Creo que es extraño que esta respuesta haya recibido un par de votos negativos sin una explicación clara de por qué. Supongo que los downvoters están malinterpretando la pregunta, que es preguntar cómo cambiar el grupo de procesos del shell actual . O tal vez saben cómo hacer un setpgrp desde el shell, pero están guardando el secreto para sí mismos.


Si set -m on, los nuevos procesos se generarán en un nuevo grupo de procesos, y si están en segundo plano, no se ignorarán los SIGINT y SIGQUIT.

if [ $$ = $(ps -o pgid -hp $$) ]; then echo already a process group leader; else set -m $0 "$@" #optionally with & set +m fi

El nuevo grupo de procesos de programas que se ejecutan después de que set -m se set -m en el grupo de procesos de primer plano del terminal, a menos que se ejecuten en segundo plano.

El set -m es aparentemente semi-estándar, requerido por POSIX si la implementación es compatible con "Utilidades de Portabilidad de Usuario". En la práctica, funciona en bash , dash , ksh , pdksh , sh , yash y zsh . posh no lo tiene.