2016-07-27 115 views
1

我使用-wait-event-and-download參數運行gphoto,以便使用我的紅外遙控器拍攝的照片保存到計算機中。獲取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 

任何人都可以幫助我,如果聲明?我可以讀取正在運行的gphoto進程的當前輸出行嗎?

+0

我期待使用'expect'先運行'gphoto -wait-event',然後監視「Downloading」字符串是否存在,當它發生時,將一些系統範圍的變量(例如「 gphotoIsBusy「)設置爲1,當檢測到」Saving「字符串時再次將其關閉。任何人都知道如何讓預期持續監控,像這樣開啓/關閉變量? – 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必須是可執行的腳本,並在某些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經常(和成功)等待下載的開始,它工作正常。 myHook.sh顯示給你什麼$ ACTION的內容? – mviereck