GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué no puedo obtener la salida de Pgrep directamente a la variable en Bash Script?

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 varios compton procesos que ahora han sido eliminados, o al menos señalados, y exec compton -b no se ejecutará.

  • Si pkill compton falla (ningún proceso coincide con el nombre, o hubo algún error interno en pkill ), el cuerpo del if declaración llamaría a su exec compton -b , que reemplazaría el proceso de shell con el proceso resultante de ejecutar compton -b .


Linux
  1. ¿Por qué The Bash Script no reconoce los alias?

  2. ¿Por qué es legal establecer una variable antes de un comando en Bash?

  3. ¿La variable Curl Outfile no funciona en Bash Script?

  4. ¿Por qué no puedo usar Cd en un script Bash?

  5. ¿No puede obtener el código de salida correcto de un script?

Imprima la salida de la declaración cat en el bucle de script bash

Cómo obtener PID del proceso secundario bifurcado en el script de shell

Use la variable Bash dentro de la secuencia de comandos SLURM sbatch

¿Por qué cat /dev/urandom colgó mi script bash?

Cómo hacer que pgrep muestre la información completa del proceso

¿Redirigir la salida del comando de tiempo en Unix a una variable en bash?