Estoy tratando de hacer un script para salir de Compton si se está ejecutando o iniciarlo si no se está ejecutando. Leí de man que debería salir 1 si se encuentra el proceso, así que intenté crear un script que lo use... Sin embargo, esto simplemente no funciona, comienza si está cerrado pero no lo cierra. que estoy haciendo mal??
#!/bin/bash
status=$(pgrep compton 2>&1)
if [[ $status == 1 ]];
then
killall compton
else
exec compton -b
fi
echo $status
Respuesta aceptada:
Tu eres obteniendo el pgrep
salida en su status
variable. Simplemente no es el resultado que espera que sea.
pgrep
genera los ID de proceso (PID) de los procesos que coinciden con el patrón que le das. Si hay un proceso cuyo nombre coincide con compton
, luego $status
sería el PID de ese proceso, o de esos procesos. pgrep
también devuelve un estado de salida, pero la sustitución de un comando no captura un estado de salida como una cadena.
En su prueba, compara $status
contra 1
. Es poco probable que compton
tiene PID 1.
Si quieres matar a cualquier compton
procesar si existen, e iniciar compton -b
si no hay compton
el proceso existe, puede hacerlo con
#!/bin/sh
if ! pkill compton; then
exec compton -b
fi
Esto usa el estado de salida de pkill
. El pkill
la herramienta funciona de manera equivalente a pgrep
(generalmente se distribuyen e instalan como un par) pero en lugar de generar PID de procesos coincidentes como pgrep
haría, pkill
envía el TERM
señal (por defecto) a los procesos coincidentes.
El if
palabra clave usa el estado de salida del comando que usa con él.
El !
invierte el sentido de la prueba para que
-
Si
pkill compton
tiene éxito, significa que había uno o varioscompton
procesos que ahora han sido eliminados, o al menos señalados, yexec compton -b
no se ejecutará. -
Si
pkill compton
falla (ningún proceso coincide con el nombre, o hubo algún error interno enpkill
), el cuerpo delif
declaración llamaría a suexec compton -b
, que reemplazaría el proceso de shell con el proceso resultante de ejecutarcompton -b
.