2016-07-27 3 views
1

У меня есть gphoto, работающий с аргументом -wait-event-and-download, так что изображения, которые я использую с помощью инфракрасного пульта, сохраняются на компьютере.получить текущий статус gphoto2

У меня есть второй сценарий, созданный для прерывания процесса ожидания и сфотографировать программно, например, так:

#!/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 

Но я хочу, чтобы убедиться, что первый процесс поживет событие не в настоящее время загрузки изображения прежде чем я его перебиваю (что вызывает беспорядочную ситуацию, когда изображения заполняют барабан камеры, предотвращая дальнейшую операцию). Таким образом, второй сценарий должен быть примерно таким:

#!/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 

Может ли кто-нибудь помочь мне в этом заявлении if? Могу ли я читать текущую выходную строку работающего процесса gphoto?

+0

Я использую 'expect' для запуска' gphoto -wait-event', а затем отслеживает наличие строки «Загрузка», а когда это происходит, переверните некоторую общесистемную переменную (например, gphotoIsBusy ") до 1, выключая его снова, когда обнаруживается строка« Сохранение ». Кто-нибудь знает, как заставить постоянно отслеживать, вставляя переменную вкл./Выкл. Так? – ajlowndes

ответ

1

я в конце концов удалось это с помощью сценария следующим образом:

#!/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 

, которые могут быть вызваны с другой сценарий:

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

Примечание. pidof - это обычная программа - (очевидно) получает pid именованного процесса. – ajlowndes

1

gphoto2 имеет возможность --hook-скрипт FILENAME. FILENAME должен быть исполняемым скриптом и вызывается на некоторые события gphoto2. Затем в сценарии есть переменная среды ACTION, которую вы можете использовать для своей цели. Например: Вы называете gphoto2 с

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

и myhook.sh выглядит

#! /bin/bash 
echo $ACTION 

тогда myhook.sh будет называться 4 раза. Его мощность составляет

init 
start 
download 
stop 

см. Man gphoto2 для деталей.

+0

Я заглянул в -hook-script, но в итоге нашел, что это не сработает для моей цели, потому что скрипт вызывается только после того, как у изображения есть ЗАВЕРШЕННАЯ загрузка. Но мне нужно было обнаружить, когда gphoto2 НАСТОЯТЕЛЬНО загружал изображение, чтобы решить, разрешать ли прерывание или нет. – ajlowndes

+0

... но спасибо за указание, что скрипт должен быть исполняемым, чего я не знал. Не помогло мне, но полезно знать, тем не менее. – ajlowndes

+0

Я использую параметр --hookscript очень часто (и с успехом), чтобы дождаться начала загрузки, он отлично работает. Какое содержание $ ACTION делает myhook.sh для вас? – mviereck

Смежные вопросы