2

我希望我的英语足以展开讨论...如果您发现一些错误,请见谅!我正在尝试编写一个 bash 脚本来启动 byzanz-record(Linux Fedora 下的屏幕录像机)一段不确定的时间,直到它被另一个脚本停止。Byzanz-record 需要一个选项 --duration 来指定记录的持续时间,但我希望它可以是无限期的。试图给出这个命令:

byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=86400 --delay=0 ~/Video/test.flv

然后用 kill 命令手动停止它,当决定时,我获得了一个虚拟持续时间为 24 小时(86400 秒)的 test.flv 文件,无法使用时间线滑块滚动视频,因为视频实际上是远少于24小时,所以很难,然后我想得到一个显示真实持续时间的视频。所以我正在考虑使用环境变量作为 --duration 选项。我正在尝试以这种方式:

#!/bin/bash
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
sec_byzanz=$(ps -p ${pid_byzanz} -o etime= > /tmp/byzanz_elapsed_time && more /tmp/byzanz_elapsed_time | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
x=$(( ${sec_byzanz} + 3 ))
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=$x --delay=0 /home/Riccardo/Video/test.flv
exit

我在其中创建了两个环境变量 ${pid_byzanz} 和 ${sec_byzanz},其中第一个注册了 byzanz-record 进程的 PID,这是命令“ps -p PID -o etime=”所必需的,它给了我持续时间以 hh:mm:ss 格式启动的进程,然后我用命令在几秒钟内翻译:

sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc

我将在环境变量 ${sec_byzanz} 中注册,我认为应该增加任意数字(例如 3)以允许进程启动,否则它可能会在启动的同一时刻结束,并且通过这种方式,也许我应该能够为我的进程获得一个无限期(因为 --duration 选项将是 3 的总和,其数字会自行增加,直到从另一个启动的脚本生成下一次杀戮)。

这是我的想法,但脚本没有按预期工作,因为它不会将我的 ${sec_byzanz} 变量与 3 相加,但它会创建一个持续时间仅为 3 秒的视频。我怎样才能实现我的目的。我刚开始编写 bash 脚本,我试图在谷歌上找到一个解决方案,直到我找到这个页面(如何在 bash 脚本中添加数字)来总结两个变量,我没有目标地尝试过,所以我的直接向您请求。

我希望有一个解决方案。

问候,

里卡多

编辑1:

在终端中,我发出命令:

./launch_byzanz-record

其中“launch_byzanz-record”是我的脚本,里面有:

#!/bin/bash
pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")
sec_byzanz=$(ps -p ${pid_byzanz} -o etime= > /tmp/byzanz_elapsed_time && more /tmp/byzanz_elapsed_time | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
x=$(( ${sec_byzanz} + 60 ))
byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=$x --delay=0 /home/Riccardo/Video/test.flv
exit

当前进程的 commad 输出为:

$ ps ax | grep byzanz-record

 4314 pts/1    S+     0:00 /bin/bash ./launch_byzanz-record
 4318 pts/1    Sl+    0:04 byzanz-record -v -a -c --display=:0.0 --width=1366 --height=768 --duration=60 --delay=0 /home/Riccardo/Video/test.flv
 4330 pts/0    S+     0:00 grep --color=auto byzanz-record

直到 60 秒结束(我增加了秒数,让我有时间测试会发生什么)。

编辑2:

也许我可以做这样的事情,作为想法,我必须尝试在 bash 脚本中进行转换:

基数是选择较大的固定数,如:

24h = "86400 秒" = "记录时间" + "加时赛"

我希望“记录时间”作为我的选项“--duration”的值。所以,我可能会做一些这样的,可能:

  • 如果我的进程byzanz-record没有运行,我的$x环境变量是一个固定的大数字(例如86400 seconds);

  • 如果我的进程byzanz-record开始运行,相反,我的$x变为“记录时间”=“ 86400 秒”-“额外时间”= “86400 秒”-(“86400 秒”-“记录时间”),其中“记录” time ”是“ ps -p ${pid_byzanz} -o etime= ”命令的输出......它可以作为想法吗?

4

3 回答 3

2

是我的解决方案,用意大利语!我解决了!!作为我英语的练习,我也会尽快为您翻译成英语:)!你好

里卡多

于 2013-03-09T22:35:50.440 回答
1

这是我的。我发现杀死 byzanz-record 进程会截断我想要的视频。我只在 gif 和一台机器上测试过这个,所以我不能保证它在任何地方都能像这样工作。

基本上我启动 byzanz-record 并将其发送到后台。然后我启动一个 dzen2,点击 dzen 栏会退出 dzen。一旦退出,原始的 byzanz 进程就会被杀死。

我只做 60 多岁,因为我不想让 byzanz 有机会吃掉我所有的公羊。我想要更长的 gif 的那一天就是我增加这个限制的那一天。

byzanz-record -d 60 $DIMS "$IMAGE" &
echo "Recording window.  Click here to exit." | dzen2 -e 'button1=exit;button2=exit;button3=exit' -p 
kill $PID

您可以提供自己的尺寸来代替 $DIMS。我改用我写的函数。

function byzanz-dimensions() {
  info="$(xwininfo)"
  x=$(echo "$info" | grep 'Absolute upper-left X' | cut -f 7 -d' ')
  y=$(echo "$info" | grep 'Absolute upper-left Y' | cut -f 7 -d' ')
  w=$(echo "$info" | grep Width | cut -f 4 -d' ')
  h=$(echo "$info" | grep Height | cut -f 4 -d' ')

  echo "-x $x -w $w -y $y -h $h"
}

整个过程发生在另一个脚本中,该脚本将新保存的图像上传到 imgur。 https://github.com/sagotsky/.dotfiles/blob/master/.cli-board/record-gif-imgur

于 2013-12-23T19:41:23.573 回答
0

你的第一行

pid_byzanz=$(ps -o pid --no-headers -C "byzanz-record")

应该为 生成一个空字符串pid_byzanz,因为您实际上还没有运行byzanz-record。结果,您实际上并没有从第二行获得任何输出,因为您真正运行的命令是

ps -p -o etime

这会导致错误,因为您没有指定进程 ID。因此, 的值x本质上是 0 + 您提供的任何硬编码值。

ps只能告诉您活动进程运行多长时间,而不是未来进程可能运行多长时间。我不知道byzanz-record,所以我不能建议一种让它提前停止录制的方法(只需给它一个巨大的持续时间并在你想要它停止时手动杀死它可能会起作用)。

于 2013-03-08T19:38:39.790 回答