2 votos

¿Por qué mi BASH script que está siendo ejecutado dos veces? Estoy usando launchd

Tengo una plist asociados con este launchd agente. Hay un agente que aparece en launchctl lista, y llama a mi script de bash, llamado rc.wakeup, siempre que el mac es despertado de su sueño. Sólo hay una copia de este script de bash. El código en el script de bash que no se repite. A pesar de esto, el bash script se ejecuta dos veces en su totalidad. Por qué?

He creado un instalar un script de bash y un desinstalar un script de bash. He sido la ejecución de estos en una serie de un intento de obtener secuencias de comandos de trabajo por lo que este programa puede ser utilizado por cualquier persona. Creo que incorrectamente la instalación/desinstalación de estos archivos ha causado el problema, aunque no tengo idea de por qué lo haría.

Aquí está el plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>de.bernhard-baehr.sleepwatcher</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/sbin/sleepwatcher</string>
            <string>-V</string>
            <string>-s /etc/rc.sleep</string>
            <string>-w /etc/rc.wakeup</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

Aquí es el de instalar el script que uso para instalar el programa:

#!/bin/bash
sudo mkdir -p /usr/local/sbin /usr/local/share/man/man8
sudo cp ~/Desktop/mysecureview/sleepwatcher_2.2/sleepwatcher /usr/local/sbin
sudo cp ~/Desktop/mysecureview/sleepwatcher_2.2/sleepwatcher.8     /usr/local/share/man/man8

mkdir ~/mysecureview
mkdir ~/mysecureview/log
mkdir ~/mysecureview/pics

cp ~/Desktop/mysecureview/imagesnap-master/imagesnap ~/mysecureview/imagesnap

mkdir ~/Library/LaunchAgents
cp ~/Desktop/mysecureview/sleepwatcher_2.2/config/de.bernhard-baehr.sleepwatcher-20compatibility.plist ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility.plist

launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility.plist

sudo cp ~/Desktop/mysecureview/sleepwatcher_2.2/config/rc.wakeup /etc/rc.wakeup
sudo cp ~/Desktop/mysecureview/sleepwatcher_2.2/config/rc.wakeup /etc/rc.sleep

cp ~/Desktop/mysecureview/num.txt ~/mysecureview/num.txt
cp ~/Desktop/mysecureview/logs.txt ~/mysecureview/logs.txt
cp ~/Desktop/mysecureview/compile.bash ~/mysecureview/compile.bash
cp ~/Desktop/mysecureview/uninstall ~/mysecureview/uninstall

mkdir ~/mysecureview/logs.txt
echo "========================"
echo "~Installation Succesful~"
echo "========================"

aquí está la secuencia de comandos de desinstalación:

#!/bin/bash
launchctl unload ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility.plist;
rm ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility.plist
sudo rm /etc/rc.wakeup
sudo rm /etc/rc.sleep

sudo killall sleepwatcher
sudo rm -rf /Library/StartupItems/SleepWatcher

launchctl unload de.bernhard-baehr.sleepwatcher
launchctl remove de.bernhard-baehr.sleepwatcher

rm ~/mysecureview/num.txt
rm ~/mysecureview/compile.bash
rm ~/mysecureview/imagesnap
rm ~/mysecureview/logs.txt

for i in {1..100}
do
        p=".txt"
        x="$i$p"
        rm ~/mysecureview/log/$x
done

rmdir ~/mysecureview/log

echo "====================="  
echo "~Uninstall Successful"
echo "====================="

Aquí está el actual secuencia de comandos se ejecuta cuando el equipo está despierta:

for user in `echo 'show State:/Users/ConsoleUser' | scutil | awk     '/kCGSSessionUserNameKey/ { print $3 }'`; do
        home=`eval echo ~$user`
        if [ -x "$home/.wakeup" ]; then
                logger -t $0 "executing .wakeup of user $user"
                su - $user -c "$home/.wakeup"
        fi
done

#The following is the MySecureView script used to capture the picture and its information.
cd ~/mysecureview

# take a picture.
./imagesnap

#get the log index. Create a variable for and iterate the index.
numPics=$(cat ~/mysecureview/num.txt)
numPics=$[numPics+1]
jpg=".jpg"
index="$numPics$jpg"

#We only allow 100 log entries to exist at a time.
if [ $numPics == 100 ]; then
        numPics=1 
fi

#temp storage for the newest picture.
cp ~/mysecureview/snapshot.jpg ~/mysecureview/pics/$index

rm ~/mysecureview/snapshot.jpg
rm ~/mysecureview/date.txt

# temporary storage for the most recent log entry.
date=$(date)
entry="$numPics $date"

logNum="$numPics.txt"
echo "$entry" > ~/mysecureview/log/$logNum

#store the index for next use.
echo "$numPics" > ~/mysecureview/num.txt

#compile each and every log entry .txt file into the logs.txt file.
bash compile.bash

1voto

tobygriffin Puntos 326

Hay mucho que hacer aquí.

Tienes un demonio llamado SleepWatcher 2.2, que se mantiene vivo por launchd. Supuestamente ejecuta su /etc/wakeup.rc secuencia de comandos en el equipo de wake. Su secuencia de comandos, a continuación, llama al programa imagesnap.

El script se ejecuta dos veces. Me gustaría primer vistazo a launchctl list y, a continuación, ps a ver si SleepWatcher se está ejecutando dos instancias. Si no, entonces me gustaría señalar con el dedo a SleepWatcher llamar la estela de secuencia de comandos de dos veces.

A menos que quieran profundizar en SleepWatcher de la fuente, usted necesita para hacer su guión resistente a varias llamadas. Quizás touching un archivo de bloqueo en el comienzo de la ejecución y la eliminación de algunos segundos después de haber terminado? Su script, a continuación, comprobar la existencia de este fichero de bloqueo y de anulación, si es que existe.

PS: me gustaría poner su wakeup.rc archivo en algún lugar de la carpeta principal del usuario, no en todo el sistema /etc porque es un nivel de usuario launchd agente, no un nivel de root. Quizás ~/mysecureview/.wakeup.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X