2

私の英語がディスカッションを開くのに十分であることを願っています...何か間違いを見つけたらごめんなさい!Linux Fedoraでスクリーンレコーダーであるbyzanz-recordを別のスクリプトで停止するまで、不定の時間起動するbashスクリプトを作成しようとしています。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

ここで、2つの環境変数${pid_byzanz}と${sec_byzanz}を作成します。最初の変数は、コマンド "ps -p PID -oetime="に必要なbyzanz-recordのプロセスのPIDを登録します。起動されたプロセスの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スクリプトに数値を追加するにはどうすればよいですか)を見つけて2つの変数を合計するまで、Googleで解決策を見つけようとしましたが、目標なしで試しました。あなたに直接リクエストしてください。

私は解決策を望んでいます。

ご挨拶、

リカルド

編集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

現在のプロセスのコンマの出力は次のとおりです。

$ 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」の値として「recordtime」が必要ですだから、私はおそらくこのようなものを作るかもしれません:

  • プロセスbyzanz-recordが実行されていない場合、$ xアンビエント変数は固定された大きな数値です(例:86400秒)。

  • プロセスbyzanz-recordが実行を開始すると、代わりに、$xは" record time " = " 86400 seconds "-" extra time " = "86400 seconds"-( "86400 seconds"-"record time")になります。ここで、 " record time "は、" ps -p $ {pid_byzanz} -o etime = "コマンドの出力です...アイデアとして機能する可能性がありますか?

4

3 に答える 3

2

ここに私の解決策、イタリア語で!解決しました!! 私の英語の練習問題として、私も英語に翻訳します。あなたのために、できるだけ早く:)!やあ

リカルド

于 2013-03-09T22:35:50.440 に答える
1

これが私のものです。byzanz-record プロセスを強制終了すると、必要な場所でビデオが切り捨てられることがわかりました。私はこれをgifと1台のマシンでのみテストしたので、どこでもそのように機能することを保証することはできません.

基本的にbyzanz-recordを起動してバックグラウンドに送ります。次に、dzen バーをクリックすると dzen が終了するというイベントで、dzen2 を起動します。それが終了すると、元の byzanz プロセスは強制終了されます。

byzanz にすべての RAM を食べてもらいたくなかったので、60 秒しかやっていません。より長い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あります。その結果、実際に実行しているコマンドは次のようになっているため、2行目から実際に出力を取得することはありません。

ps -p -o etime

プロセスIDを指定していないため、エラーが発生します。結果として、の値xは基本的に0+指定したハードコードされた値になります。

ps将来のプロセス実行される可能性がある期間ではなく、アクティブなプロセスが実行されている期間のみを通知できます。わからないので、早めに録音を停止する方法を提案することはできません(単に、膨大な時間を与えて、停止したいときに手動で強制終了するとうまくいく場合があります)。byzanz-record

于 2013-03-08T19:38:39.790 に答える