你所描述的是File Alteration Monitor的工作。
首先,您已有的「incrontab」解決方案是一個很好的起點,因爲您正在從shell啓動。 incrontab是一個基於inotify(7)的解決方案,這是一個巨大的優勢。這意味着你不是輪詢,這節省了CPU。你需要shell和系統級解決方案,我不是Flash程序員,所以我會堅持你的問題,儘管我認爲更好的解決方案是創建一個Flash「包裝器」也許使用AS3 Loader類來吸收現有的SWF,並從incrontab發起的事件接收通知。 Flash編程已經超出了這個答案的範圍,儘管它可能會提供更優雅的解決方案。
所以......
您當前的方法由啓動腳本首先殺死任何現有gtk-gnash
過程然後運行一個新的。當incrontab發現文件發生變化時,它會從頭開始重新啓動。如果您相信您的Flash應用程序永遠不會崩潰並退出,並且您始終擁有完美的時機,那麼這是一個可行的解決方案。其中一個問題是,在一個過程的死亡和下一個過程的開始之間你有一個未知的延遲。您的killall
發送一個信號,其中gtk-gnash
可能立即響應或暫停後響應。暫停一下,你可能會發現自己在舊版本完全離開之前啓動了SWF。暫停較長時間後,您可以簡單地顯示桌面。
一個更好的解決方案可能是簡單地在一個循環中啓動SWF:
#!/bin/sh
while true; do
date '+[%Y-%m-%d %T] myfile.swf relaunched' >> /var/log/swf.log
gtk-gnash /home/my_username/path/myfile.swf
done
然後有incrontab僅僅殺死現有工藝:
/home/my_username/path/myfile.swf IN_MODIFY killall gtk-gnash
通過從發射分離killall,你確保gtk-gnash的新實例不會啓動,直到舊實例退出並將控制權返回給包裝它的shell腳本。
當然,而是採用incrontab,你可以或者安裝inotify-tools
包,並留下一個循環運行:
#!/bin/sh
while inotifywait -e modify /home/my_username/path/myfile.swf; do
killall gtk-gnash
done
同樣的系統調用,同樣的效果,不同的前端。
如果您希望仔細查看您正在查殺的進程,還可以將gtk-gnash的pid存儲在臨時文件中。這裏的另一個採取的flash播放器包裝:
#!/bin/sh
while true; do
date '+[%Y-%m-%d %T] myfile.swf relaunched' >> /var/log/swf.log
gtk-gnash /home/my_username/path/myfile.swf &
echo $! > /var/run/gtk-gnash.pid
wait
done
而且incrontab行:
/home/my_username/path/myfile.swf IN_MODIFY xargs kill < /var/run/gtk-gnash.pid
你可能會採用降低殺/重啓可見效果的另一種策略,是採取myfile.swf的屏幕截圖,當它運行時內容很少或沒有時,就用它作爲播放器上的桌面牆紙。 (或者等價的,我不知道你是如何設置的)。我爲幾年前設立的數字標牌解決方案做了類似的事情 - 我們不時需要殺死和重啓獨立播放器,所以我們只是顯示出來的第一頁的「框架」。當我們殺死flashplayer進程時,系統「似乎」重置,其框中沒有內容......然後,一秒鐘後,內容就會顯示出來。 (是的,這是一個黑客。)
另一個提示:我一直髮現Adobe的獨立Flash播放器(「投影儀」)比gtk-gnash更可靠和更兼容。您可以在Adobe Support Centre Download Page找到Adobe的獨立播放器,這與標準的Flash Player下載頁面不同。
如何在SWF包裝器中啓動現有的SWF,如何定期檢查更新,如果看到更新,則重新加載子SWF?您是否有能力生成SWF,或者您的解決方案必須基於服務器? (關於一個JavaScript處理程序,我用SWF包裝程序做了什麼?)問題是,客戶端更容易輪詢查找更改,而不是服務器將某些內容推送到已下載SWF並關閉連接。 – ghoti
我在另一個bash腳本中自己生成SWF,然後替換已經播放的swf。只要有新內容可用,就會發生此情況這些都是在本地完成的,輸出SWF在某個走廊的屏幕上播放。如果我正確地理解了你,JS包裝必須是來自瀏覽器內部的腳本,我猜這樣的JS無法意識到磁盤更改,只能定期重新加載,這是一個輕微的性能問題)。另外,我對JS並不熟練,並且希望保持這種狀態;)(我認爲這是一個不必要的複雜因素,必須有一個更簡單的解決方案)。 – bartekbrak
所以你在獨立播放器中啓動這個SWF?這將是有用的信息開始。如果是這種情況,您可以簡單地在一個循環中運行播放器,然後讓一個單獨的進程監視更改,如果播放器發現有變化,就會導致播放器死機。如果這聽起來不錯,我會發佈一個答案。 – ghoti