获取 gphoto2 的当前状态
get current status of gphoto2
我有 gphoto 运行 一个 --wait-event-and-download 参数,这样我用红外遥控器拍摄的照片就会保存到电脑上。
我设置了第二个脚本来中断等待过程并以编程方式拍照,如下所示:
#!/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 进程的当前输出行吗?
我最终用这样的脚本解决了这个问题:
#!/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"
gphoto2 有一个选项 --hook-script 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。
我有 gphoto 运行 一个 --wait-event-and-download 参数,这样我用红外遥控器拍摄的照片就会保存到电脑上。
我设置了第二个脚本来中断等待过程并以编程方式拍照,如下所示:
#!/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 进程的当前输出行吗?
我最终用这样的脚本解决了这个问题:
#!/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"
gphoto2 有一个选项 --hook-script FILENAME。 FILENAME 必须是一个可执行的脚本,并且在某些 gphoto2 事件中被调用。然后该脚本有一个环境变量 ACTION,您可以将其用于您的目的。 例如:你用
调用 gphoto2gphoto2 --capture-image-and-download --hook-script myhook.sh
和myhook.sh看起来像
#! /bin/bash
echo $ACTION
那么myhook.sh会被调用4次。它的输出是
init
start
download
stop
有关详细信息,请参阅 man gphoto2。