linux - editar - kid3
Comprobando si existe una pantalla con el nombre especificado (5)
He creado un archivo bash que inicia otro archivo bash en una pantalla separada con un nombre único. Necesito asegurarme de que solo se ejecute una instancia de ese archivo bash interno en un momento dado. Para hacer esto, quiero hacer que el archivo bash primario verifique si existe la pantalla con ese nombre antes de intentar crearlo. ¿Hay un método para hacer esto?
% 100 trabajo.
screen -list | grep "SESSÄ°ON NAME" && echo "Active Program" || echo "Passive Program"
Dado que no puedo comentar, estoy publicando esto como una nueva respuesta. La respuesta de Troyfolger es una buena idea y básicamente equivale a intentar enviar a la sesión un comando que hará muy poco. Un problema es que para algunas versiones (más antiguas) de screen -Q no se admite, por lo que para esas versiones el comando correcto es
screen -S Jetty -X select . ; echo $?
Lo cual envía el comando "seleccionar". A la sesión de pantalla llamada "Jetty".
Seleccione los cambios que ventana está activa y. significa la ventana activa actual, por lo que esto significa probar y cambiar la ventana activa a la ventana activa actualmente. Esto solo puede fallar si no hay una sesión para conectarse a lo que queríamos.
Si lees los documentos de información que sugieren que el único uso de seleccionar. es con -X como prueba o para asegurarse de que hay algo seleccionado.
Puede consultar el comando ''seleccionar'' de la pantalla para una sesión en particular; el resultado del shell es ''0'' si existe la sesión, y ''1'' si no se encuentra la sesión de pantalla nombrada:
$ screen -S Tomcat $ screen -S Tomcat -Q select . ; echo $? 0
versus:
$ screen -S Jetty -Q select . ; echo $? No screen session found. 1
Tenga en cuenta que el ''.''
después de la select
es opcional, pero puede ser más robusto.
Puede obtener el resultado de screen -list
de screen -list
para el nombre de la sesión que está verificando:
if ! screen -list | grep -q "myscreen"; then
# run bash script
fi
Todas las soluciones propuestas no tratan con nombres de pantalla que no tengan patrones únicos, por ejemplo, "TEST" y "TEST123". Cuando screen -S "TEST"
o screen -S "TEST"
screen -list "TEST"
, puede que seleccione la pantalla "TEST123". Hay algo incorrecto (no determinístico) en cómo la pantalla GNU implementa la coincidencia de nombres de pantalla.
A continuación se muestra una función de bash que intenta hacer coincidencias exactas y devolver el PID.SCREEN NAME
junto con un código de salida:
function find_screen {
if screen -ls "$1" | grep -o "^/s*[0-9]*/.$1[ "$''/t''"](" --color=NEVER -m 1 | grep -oh "[0-9]*/.$1" --color=NEVER -m 1 -q >/dev/null; then
screen -ls "$1" | grep -o "^/s*[0-9]*/.$1[ "$''/t''"](" --color=NEVER -m 1 | grep -oh "[0-9]*/.$1" --color=NEVER -m 1 2>/dev/null
return 0
else
echo "$1"
return 1
fi
}
Uso - seleccione una pantalla:
target_screen=$(find_screen "SCREEN NAME")
screen -S "$target_screen" ...etc...
Uso - prueba si existe una pantalla:
if find_screen "SCREEN NAME" >/dev/null; then
echo "Found!"
fi
De todos modos, esto cubrirá el 99,9% de los casos. Para estar 99,99% seguro, escapa grep special chars en el nombre de pantalla. Una coincidencia perfecta requeriría que grep coincida con toda la línea hasta $, incluida la fecha entre paréntesis que puede evolucionar con las versiones. El otro método de coincidencia perfecta sería:
ls -A -1 /var/run/screen/S-${USER} | grep "^[0-9]*/.SCREEN NAME$"
Pero eso es intrépido, y debemos asegurarnos de que la implementación de la pantalla use esta carpeta. No recomiendo este último método.