¿Puedo hacer una línea de comando bash que solo ejecute cierto comando si el proceso no se está ejecutando (en segundo plano)?
¿Cómo verifico *, si ya se está ejecutando un comando?
(entonces puedo agregar el siguiente comando &&
entre ellos para que el siguiente solo se ejecute si el primero es verdadero).
*: prueba, determinar, descubrir, descubrir
ps -ef | grep -v grep | grep "process_name" || run_command_here
pgrep "process_name"
lugar deps | grep | grep
Respuestas:
Usa herramientas demoníacas . Puede usar
svok
para verificar si actualmente se está ejecutando un proceso de servicio / demonio / fondo.Para otros métodos ver:
fuente
He usado esta técnica de vez en cuando:
Antes de
pgrep
que se hiciera de esta manera:ejemplo
El bit con el
[p]
hace quegrep
no se encuentre como resultado.fuente
Esto puede ser complicado, porque puede tener instancias separadas del mismo proceso que viven independientemente. Por ejemplo, servidores que escuchan en diferentes puertos o servicios que se ejecutan como diferentes usuarios. Para distinguir entre estas instancias, debe asignar a cada una de ellas una etiqueta única. La etiqueta a menudo es un archivo, pero puede ser un socket local en el espacio de nombres abstracto, un puerto TCP, etc., cualquier identificador único servirá. Cuando la etiqueta es un archivo, puede ser un archivo normal que contiene una ID de proceso (un archivo pid) o una tubería o socket con nombre que el archivo está escuchando, etc. Idealmente, la etiqueta es un punto final de comunicación que permite a los clientes conectarse a ese proceso.
Cada uno de estos diferentes tipos de etiquetas da como resultado una forma diferente de verificar si la instancia que está buscando está en funcionamiento. Por ejemplo, con un socket de archivo local, intente conectarse a él e inicie el proceso si no hay ningún proceso escuchando en ese socket. Si la etiqueta es un archivo pid, verifique si hay un proceso con esa ID de proceso, pero tenga en cuenta que es frágil, ya que si el proceso ha muerto, puede haber un proceso no relacionado que haya reutilizado su ID. Tenga en cuenta que si dos clientes intentan alcanzar el proceso en un corto período de tiempo, ambos pueden encontrar que el proceso no existe y ambos intentan iniciarlo; Proteger adecuadamente de esta condición de carrera puede ser complicado.
Es más fácil administrar instancias cuando todas son iniciadas por el mismo proceso de supervisor, y ese proceso de supervisor detecta cuándo mueren las instancias y reacciona en consecuencia. Muchos programas de monitoreo de servicios que pueden hacer esto.
Si el programa no responde en un punto final de comunicación conocido y no es administrado por un programa supervisor, la etiqueta del pobre es un archivo pid: un archivo que contiene la ID del proceso. Cuando comience el proceso, escriba el pid en un archivo con un nombre predeterminado. Cuando necesite que exista el proceso, lea el archivo pid y vea si hay un proceso con ese pid. Cuando elimine el proceso, borre el archivo pid. El problema más importante con un archivo pid no supervisado es que si el proceso muere, su pid puede ser reutilizado por algún proceso no relacionado. Al menos debe verificar el nombre del proceso o el ejecutable del proceso para asegurarse de que está hablando con el proceso correcto. Muchas variantes de Unix tienen un comando pgrep :
pgrep SOMENAME
enumera los procesos cuyo nombre contiene SOMENAME como una subcadena, con opciones adicionales para limitar a un usuario en particular, para requerir una coincidencia exacta, para cambiar cuál de las varias nociones posibles de "nombre de proceso" se usa, etc.fuente
Podrías usar este enfoque:
fuente
Otras opciones:
pgrep -xq processname
ps -eo comm= | sed 's|.*/||' | grep -xq processname
sed 's|.*/||'
elimina las partes de nombre de directorio en OS XEn GNU / Linux
ps -o comm
trunca los nombres de los comandos a 15 caracterespgrep
yyps -C
solo coinciden con los primeros 15 caracteres.ps -C
(nombres de comando de coincidencia) no es compatible con OS X.En OS X
ps -o comm
imprime las rutas absolutas de los comandos yps -co comm
solo imprime los nombres de los comandos. En GNUps -o comm
solo imprime nombres de comandos y-c
tiene un significado diferente.El pgrep de OS X no incluye procesos ancestrales (como bash, Terminal o launchd) sin ellos
-a
. El pgrep de GNU los incluye por defecto y no es compatible-a
.grep -x
ypgrep -x
no implique-F
, así que úselo-Fx
si el nombre del proceso puede contener caracteres regex.fuente
Lo siento, pero todas estas soluciones no admiten contab ya que la misma línea de comando aparecerá dos veces en el resultado 'ps'.
Entonces aquí está el mío:
fuente
cron
trabajo?Con Bash
Nota: - eliminar
echo
si la salida se ve bien.fuente
Explicaré el caso en el que ejecutas el comando en beckgreoud. El "$!" guarde el PID del último proceso en segundo plano. Por lo tanto, puede usarlo para encontrarlo en las tablas de proceso siguiendo las respuestas anteriores:
El comando incorporado "jobs" - intente esto:
En cuanto a la opción "&&"
En lugar de && use el comando wait. En el siguiente ejemplo, myproc2 no se ejecutará hasta que myproc1 termine:
fuente
Obtenga el estado de su proceso:
ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'
Referencia:
Por ejemplo, lo he usado para reproducir o pausar condicionalmente mi proceso de sox en una sesión de tmux:
fuente
Puedes usarlo dentro de un script:
fuente