tarda sierra seguro queda progreso pro para mucho modo macbook mac limpiar iniciar imac como cargando barra arranca apaga macos bash unix process

macos - queda - modo seguro mac sierra



Compruebe si el proceso de Mac se está ejecutando utilizando Bash por nombre de proceso (10)

¡Seguro que sí!

pgrep, pkill y pfind para OpenBSD y Darwin (Mac OS X)

http://proctools.sourceforge.net

(también disponible a través de MacPorts: información de puerto proctools)

pidof por nightproductions.net

¿Cómo verifica si un proceso en Mac OS X se está ejecutando usando el nombre del proceso en un script Bash?

Estoy tratando de escribir una secuencia de comandos Bash que reiniciará un proceso si se ha detenido pero no hace nada si todavía se está ejecutando.


¿Mac tiene pidof? ...

if pidof $processname >/dev/null ; then echo $processname is running ; fi


Analizando esto:

ps aux | grep [-i] $ProcessName | wc -l

... es probablemente tu mejor apuesta. Aquí hay un breve guión que hace lo que buscas:

#!/bin/bash PROCESS=myapp number=$(ps aux | grep $PROCESS | wc -l) if [ $number -gt 0 ] then echo Running; fi

EDITAR: Inicialmente -i una marca -i en grep para que sea insensible a mayúsculas y minúsculas; Hice esto porque el programa de ejemplo que probé era python , que en Mac OS X se ejecuta como Python ; si conoce exactamente el caso de su aplicación, el -i no es necesario.

La ventaja de este enfoque es que puede escalar con usted: en el futuro, si necesita asegurarse de que, por ejemplo, se estén ejecutando cinco instancias de su aplicación, ya está contando. La única advertencia es si otra aplicación tiene el nombre de su programa en su línea de comandos, podría aparecer: las expresiones regulares a grep resolverán ese problema, si es astuto (y se encuentra con esto).

Investigue las páginas del manual de Darwin para ps , grep y wc .


Este simple comando hará el truco. Los corchetes alrededor del nombre del proceso impiden que el comando grep se muestre en la lista de procesos. Tenga en cuenta que no hay espacio después de la coma. Puede haber algunos problemas de portabilidad, ya que ps en algunos sistemas Unix puede requerir un guión antes de las opciones:

ps axo pid,command | grep "[S]kype"

La ventaja es que puede utilizar los resultados en una declaración if como esta: ''

if [[ ! $(ps axo pid,command | grep "[i]Tunes.app") ]]; then open -a iTunes fi

O si prefieres este estilo:

[[ ! $(ps axo pid,command | grep "[S]kype") ]] && open -a Skype || echo "Skype is up"

Otra ventaja es que puede obtener el pid agregando una canalización a awk ''{print $ 1}''.

echo "iTunes pid: $(ps axo pid,command | grep "[i]Tunes.app" | awk ''{print $1}'')"


He extendido un script pidof que se encuentra en la red para usar expresiones regulares (generalmente subcadenas) y no distingue mayúsculas de minúsculas

#!/bin/sh ps axc |awk "BEGIN{ n=tolower(/"$1/")}/ tolower(/$5) ~n {print /$1}";

simplemente cree un script llamado "pidof" con este contenido, y póngalo en su ruta, es decir, en uno de los directorios de

echo $PATH

y hazlo ejecutable (tal vez usando sudo)

chmod 755 /usr/local/bin/pidof

y usalo asi, por supuesto

kill -9 `pidof pyth`


Me falta la reputación para comentar sobre la respuesta de killall anterior, pero hay killall -s para hacerlo sin enviar ninguna señal:

killall -s "$PROCESSNAME" &> /dev/null if [ $? -eq 0 ]; then echo "$PROCESSNAME is running" # if you also need the PID: PID=`killall -s "$PROCESSNAME" | awk ''{print $3}''` echo "it''s PID is $PID" fi


Otra forma es usar (¿abuso?) La opción -d del comando killall . Las opciones -d realidad no detendrán el proceso, sino que imprimirán lo que se hará. También saldrá con el estado 0 si encuentra un proceso coincidente, o 1 si no lo hace. Poniendo esto juntos:

#!/bin/bash `/usr/bin/killall -d "$1" &> /dev/null` let "RUNNING = ! $?" # this simply does a boolean ''not'' on the return code echo $RUNNING

Para dar crédito donde se debe, originalmente saqué esta técnica de un script en el instalador de iTunes.


Puede usar killall o kill, dependiendo de si está intentando encontrar la tarea por PID o por nombre.

Por nombre:

if ! killall -s -0 $PROCESS_NAME >/dev/null 2>&1; then # Restart failed app, or do whatever you need to prepare for starting the app. else at -f $0 +30seconds # If you don''t have this on cron, you can use /usr/bin/at fi

Por PID:

if ! kill -0 $PID 2>/dev/null; then # Restart app, do the needful. else at -f $0 +30seconds fi

Si observa el Manual de OSX , verá un conjunto diferente de comandos de gestión de procesos; Ya que no es el kernel de Linux, tiene sentido que administren los procesos de manera diferente.

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/killall.1.html

Una salida de muestra de mi terminal (eliminando el usuario y el nombre de host, por supuesto):

user@localhost:~$ kill -0 782 # This was my old, stale SSH Agent. bash: kill: (782) - No such process user@localhost:~$ echo $? 1 user@localhost:~$ kill -0 813 # This is my new SSH agent, I only just created. user@localhost:~$ echo $? 0

El código de retorno de un kill -0 siempre resultará en una forma segura de verificar si el proceso se está ejecutando, porque -0 no envía ninguna señal que alguna vez será manejada por una aplicación. No matará la aplicación, y "matar" solo se llama "matar" porque generalmente se usa para detener una aplicación.

Cuando mire las interfaces que utiliza en la fuente, verá que en realidad está interactuando directamente con la tabla de procesos (y no está generando una salida potencialmente cargada desde ps), y simplemente envía una señal a una aplicación. Algunas señales indican que la aplicación debe cerrarse o detenerse, mientras que otras señales le indican que reinicie los servicios, que vuelva a leer la configuración o que vuelva a abrir los descriptores de archivos para registrar los archivos que han sido rotados recientemente. Hay una gran cantidad de cosas que "kill" y "killall" pueden hacer que no terminan la aplicación, y se usa regularmente para simplemente enviar una señal a la aplicación.


Quizás demasiado tarde para el OP, pero esto puede ayudar a otros que encuentren este hilo.

La siguiente modificación del tema amrox anterior funciona bien para reiniciar aplicaciones en mi OS X:

killall -d TextEdit &> /dev/null && killall TextEdit &> /dev/null; open -a TextEdit

Uso el siguiente AppleScript para actualizar y reiniciar demonios:

tell application "System Events" to set pwd to POSIX path of container of (path to me) do shell script "launchctl unload -w /Library/LaunchDaemons/time-test.plist; cp -f " & quoted form of pwd & "/time-test.plist /Library/LaunchDaemons; launchctl load -w /Library/LaunchDaemons/time-test.plist" with administrator privileges

Asume que el archivo plist original o actualizado está en el mismo directorio que el AppleScript.


Una solución más corta:

if pgrep $PROCESS_NAME; then echo ''Running''; fi

Explicación:

pgrep sale con 0 si hay un proceso que coincide con $PROCESS_NAME ejecución; de lo contrario, existe con 1.
if comprueba el código de salida de pgrep y, en lo que respecta a los códigos de salida, 0 es un éxito.