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 comptontiene éxito, significa que había uno o varioscomptonprocesos que ahora han sido eliminados, o al menos señalados, yexec compton -bno se ejecutará. -
Si
pkill comptonfalla (ningún proceso coincide con el nombre, o hubo algún error interno enpkill), el cuerpo delifdeclaración llamaría a suexec compton -b, que reemplazaría el proceso de shell con el proceso resultante de ejecutarcompton -b.