¿Cómo determinar si un proceso se está ejecutando o no y utilizarlo para crear un script de shell condicional?

¿Cómo determinar si un proceso se está ejecutando o no y utilizarlo para crear un script de shell condicional?

¿Cómo puedo determinar si un proceso se está ejecutando o no y luego hacer que un script bash ejecute algunas cosas en función de esa condición?

Por ejemplo:

  • Si el proceso abcse está ejecutando, haz esto.

  • si no se está ejecutando, hazlo.

Respuesta1

Un script bash para hacer algo así se vería así:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

Este script solo verifica si el programa "gedit" se está ejecutando.

O sólo puedes comprobar si el programa no se está ejecutando así:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

Respuesta2

Cualquier solución que utilice algo así ps aux | grep abco pgrep abcsea defectuosa.

¿Por qué?

Debido a que no está verificando si se está ejecutando un proceso específico, está verificando si hay algún proceso en ejecución que coincida abc. Cualquier usuario puede crear y ejecutar fácilmente un ejecutable con nombre abc(o que contenga abcen algún lugar de su nombre o argumentos), provocando un falso positivo en su prueba. Hay varias opciones a las que puede aplicar psy greplimitar pgrepla búsqueda, pero aún así no obtendrá una prueba confiable.

Entonces, ¿cómo puedo probar de manera confiable un determinado proceso en ejecución?

Eso depende de para qué necesites la prueba.

Quiero asegurar ese servicio.a B Cse está ejecutando, y si no, inícielo

Para eso está systemd. Puede iniciar el servicio automáticamente y realizar un seguimiento del mismo, y puede reaccionar cuando muere.

Ver¿Cómo puedo comprobar si mi servidor de juegos todavía está funcionando?para otras soluciones.

a B Ces mi guión. Necesito asegurarme de que solo se esté ejecutando una instancia de mi script.

En este caso, utilice un archivo de bloqueo o un directorio de bloqueo. P.ej

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

VerPreguntas frecuentes 45 sobre Bashpara otras formas de bloqueo.

Respuesta3

Esto es lo que uso:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

En inglés simple:si 'pgrep' devuelve 0, el proceso se está ejecutando; de lo contrario, no.


Lectura relacionada:

Secuencias de comandos Bash ::Comparaciones de cadenas

Manuales de Ubuntupgrep

Respuesta4

Siguiendo la idea de @rommel-cid, puedes usarla pidofcon || (||) para ejecutar un comando si el proceso no existe y && para ejecutar algo si el proceso existe, creando así un condicional rápido si/entonces/si no. Por ejemplo, aquí hay uno con un proceso en ejecución (mi navegador Chrome, cuyo nombre de proceso es "chrome") y otro que prueba un proceso que no existe. Suprimí la salida estándar usando 1>/dev/null para que no se imprima:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

información relacionada