2013-03-08 19 views
1

我希望我的英語足以打開討論...對不起,如果你發現一些錯誤!我試圖編寫一個bash腳本來啓動byzanz-record,這是Linux Fedora下的一個屏幕錄像機,可以確定一段時間,直到它被另一個腳本停止。 Byzanz-record需要一個選項--duration來指定記錄的持續時間,但我認爲它可能是不確定的。試圖給這個命令:Bash腳本在Linux中啓動byzanz記錄(Fedora Xfce)

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記錄的過程中所必需的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腳本開始,我試圖找到一個谷歌解決方案,直到我發現這個頁面(How can I add numbers in a bash script)總結兩個變量,我嘗試沒有目標,所以我的請求直接給你。

我希望在一個解決方案。

問候,

裏卡多

編輯1:

在終端,我給了命令:

./launch_byzanz-record 

其中 「launch_byzanz記錄」 是我的腳本里面:

#!/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腳本轉換:

的基礎是要選擇一個大的定數,如:

24小時= 「86400秒」= 「記錄時間」 + 「加時」

我想「記錄時間」作爲我的選項「--duration」的值。所以,我可以做一些這樣的,大概是:

  • 如果我的過程byzanz記錄沒有運行,我$ X環境變量是一個固定的大量(例如86400秒);

  • 如果我的過程byzanz記錄開始運行,相反,我$ X成爲 「記錄時間」= 「86400秒」 - 「額外的時間」= 「 86400秒」 - ( 「86400秒」 - 「記錄時間」),其中 「記錄時間」 是 「的輸出PS -p $ {pid_byzanz} -o ETIME =」 命令強權它的工作原理?

+0

當您設置'pid_byzanz'的值時,'byzanz-record'尚未運行,是嗎?看起來你正在試圖用'ps'來預測進程在運行時需要多長時間。 – chepner 2013-03-08 19:02:31

+0

感謝您的回覆!看一下我的問題的最後一級**編輯1 **。謝謝 – 2013-03-08 19:30:57

+0

我明白你的意思......我該怎麼辦? – 2013-03-08 19:38:41

回答

1

Here我的解決方案,意大利語!我解決了它!作爲我的英語鍛鍊,我會盡快用英語翻譯它,爲你,:)!嗨

裏卡多

+0

不是很有幫助! – Sam 2014-05-11 06:16:31

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,所以我不能建議一種方法讓它停止提早錄製(只需要給它一個巨大的持續時間,並在你希望它停止的時候手動殺死它就可以)。

0

這裏是我的。我發現殺死byzanz錄製過程會截斷我想要的視頻。我只在gif中測試過,只有一臺機器,所以我不能保證它在任何地方都能正常工作。

基本上我開始byzanz記錄並將其發送到背景。然後我啓動一個dzen2,點擊dzen欄上的事件退出dzen。一旦退出,原來的拜占庭進程就會被殺死。

我只做了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