2016-07-27 9 views
1

Ich habe gphoto mit einem --wait-event-and-download-Argument laufen lassen, so dass die Bilder, die ich mit meiner Infrarot-Fernbedienung mache, auf dem Computer gespeichert werden.Aktuellen Status von gphoto2 erhalten

Ich habe ein zweites Skript eingerichtet, um die Wartezeit zu unterbrechen und ein Bild programmatisch nehmen, etwa so:

#!/bin/sh 
# shootnow.sh - stop the current gphoto2 process (if it exists), 
# shoot a new image, then start a new wait-event process. 

pkill -INT gphoto2  #send interrupt (i.e. ctrl+c) to gphoto2 
sleep 0.1    #avoid the process ownership error 
gphoto2 --capture-image-and-download #take a picture now 
gphoto2 --wait-event-and-download #start a new wait-event process 

Aber ich mag, dass der erste Warte-Ereignisprozess zur Zeit machen, ist kein Bild Download bevor ich es unterbreche (was eine unordentliche Situation verursacht, in der Bilder den Widder der Kamera füllen, was eine weitere Operation verhindert). So soll das zweite Skript etwas wie diese:

#!/bin/sh 
# shootnow-with-check.sh - stop the current gphoto2 process (if it exists 
# and isn't currently downloading an image), shoot a new image, then start 
# a new wait-event process. 

shootnow() { # same as previously, but now in a function 
    pkill -INT gphoto2 
    sleep 0.1 
    gphoto2 --capture-image-and-download 
    gphoto2 --wait-event-and-download 
} 

if [ ***current output line of gphoto2 process doesnt start with "Downloading"*** ] then 
    shootnow 
else 
    echo "Capture aborted - a picture was just taken and is being saved." 
fi 

Kann mir jemand helfen mit, dass if-Anweisung? Kann ich die aktuelle Ausgabezeile eines laufenden gphoto-Prozesses lesen?

+0

Ich suche mit 'expect' zuerst das' gphoto --wait-event', dann beobachte das Vorhandensein der "Downloading" Zeichenkette, und wenn es auftritt, drehe irgendeine systemweite Variable (zB " gphotoIsBusy ") auf 1 und schaltet sie wieder aus, wenn die Zeichenfolge" Saving "erkannt wird. Wer weiß, wie man erwartet, kontinuierlich zu überwachen, eine Variable ein-/auszuschalten? – ajlowndes

Antwort

1

ich schließlich geschafft, dies mit einem Skript wie folgt:

#!/bin/bash 
# gphoto2-expect.sh 
# use expect to monitor gphoto2 during --capture-image-and-download with 
# --interval=-1, adding in SIGUSR1 functionality except during a 
# download event. 

echo "Prepping system for camera" 
killall PTPCamera 
expect << 'EOS' 
puts "Starting capture..." 
if [catch "spawn gphoto2 --capture-image-and-download --interval=-1" gp_pid] { 
    Log $ERROR "Unable to start gphoto2.\n$gp_pid\n" 
    return 0 
} 

trap {exec kill -SIGUSR1 $gp_pid} SIGUSR1 
set timeout -1 
expect { 
    -i $spawn_id 
    "Downloading" { 
    trap {send_user "\n Ignoring request as currently downloading"} SIGUSR1 ; exp_continue 
    } 
    "Saving file as" { 
    sleep 0.1 
    trap {exec kill -SIGUSR1 $gp_pid} SIGUSR1 ; exp_continue 
    } 
} 

EOS 

, die mit einem anderen Skript ausgelöst werden könnte:

#!/bin/bash 
# trigger.sh - trigger an immediate capture 
var=$(pidof expect) 
kill -SIGUSR1 "$var" 
+0

Hinweis. pidof ist ein benutzerdefiniertes Programm - (offensichtlich) erhält die PID eines benannten Prozesses. – ajlowndes

1

gphoto2 hat eine Option --hook-Skript NAME. FILENAME muss ein ausführbares Skript sein und wird bei einigen gphoto2-Ereignissen aufgerufen. Das Skript verfügt dann über eine Umgebungsvariable ACTION, die Sie für Ihren Zweck verwenden können. Zum Beispiel: Sie rufen gphoto2 mit

gphoto2 --capture-image-and-download --hook-script myhook.sh 

und myhook.sh sieht aus wie

#! /bin/bash 
echo $ACTION 

dann wird myhook.sh 4 mal aufgerufen. Seine Ausgabe ist

init 
start 
download 
stop 

siehe Mann gphoto2 für Details.

+0

Ich schaute in --hook-script, fand aber letztendlich heraus, dass es nicht für meinen Zweck funktionieren würde, weil das Skript erst aufgerufen wird, wenn ein Bild FERTIG wird. Aber ich musste feststellen, wann gphoto2 gerade ein Bild heruntergeladen hat, um zu entscheiden, ob ein Interrupt zugelassen werden soll oder nicht. – ajlowndes

+0

... aber danke für den Hinweis, dass das Skript ausführbar sein muss, das ich nicht kannte. Hat mir nicht geholfen, aber nützlich, um trotzdem zu wissen. – ajlowndes

+0

Ich benutze Option --hookscript sehr oft (und mit Erfolg) auf den Beginn eines Downloads warten, es funktioniert gut. Welchen Inhalt von $ ACTION zeigt dir myhook.sh? – mviereck

Verwandte Themen