あなたが説明しているのは、ファイル変更モニターの仕事です。
まず、シェルから起動していることを考えると、既存の「incrontab」ソリューションは良い出発点です。incrontab がinotify(7)ベースのソリューションであるという事実は、大きな利点です。これは、ポーリングしていないことを意味し、CPU を節約します。
あなたはシェルおよびシステムレベルのソリューションを求めていますが、私は Flash プログラマーではないので、あなたの質問に固執しますが、より良い解決策は、おそらく AS3 を使用する Flash の「ラッパー」を作成することだと思います既存の SWF を吸い込み、incrontab によって起動されたものから通知を受け取るローダー クラス。フラッシュ プログラミングは、より洗練されたソリューションを提供する可能性がありますが、この回答の範囲外です。
そう...
現在の方法は、最初に既存のプロセスを強制終了してからgtk-gnash
新しいプロセスを実行する起動スクリプトで構成されています。incrontab がファイルへの変更を検出すると、最初から再起動されます。これは、フラッシュ アプリケーションが決してクラッシュして終了しないと信頼でき、常に完璧なタイミングが得られる場合に有効なソリューションです。問題の 1 つは、あるプロセスが終了してから次のプロセスが開始されるまでに未知の遅延があることです。あなたkillall
は信号を送信します。信号はgtk-gnash
すぐに応答するか、一時停止した後に応答します。少し間を置くと、古い SWF が完全になくなる前に 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 の新しいインスタンスが、古いインスタンスが実際に終了し、それをラップするシェル スクリプトに制御を戻すまで起動しないようにします。
もちろん、incrontab を使用する代わりに、inotify-tools
パッケージをインストールしてループを実行したままにすることもできます。
#!/bin/sh
while inotifywait -e modify /home/my_username/path/myfile.swf; do
killall gtk-gnash
done
同じシステムコール、同じ効果、異なるフロントエンド。
どのプロセスを強制終了するかに細心の注意を払いたい場合は、gtk-gnash の pid を一時ファイルに保存することもできます。Flash Player ラッパーの別の例を次に示します。
#!/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
強制終了/再起動の目に見える影響を軽減するために採用できるもう 1 つの戦略は、myfile.swf が最小限のコンテンツまたはコンテンツなしで実行されているときにスクリーンショットを撮り、それをプレーヤーのデスクトップの壁紙として使用することです。(または同等のもの。あなたがどのようにセットアップされているかはわかりません。) 私は数年前にセットアップしたデジタル サイネージ ソリューションで同様のことを行いました。表示される最初のページの「フレーム」だけを作成しました。flashplayer プロセスを強制終了したとき、システムはボックスにコンテンツがない状態でリセットされたように見えました...そして、1 秒後にコンテンツが表示されました。(はい、ハックです。)
もう 1 つのヒント: Adobe のスタンドアロン Flash プレーヤー (「プロジェクター」) は、gtk-gnash よりも信頼性が高く、互換性があることが常にわかっています。Adobe のスタンドアロン プレーヤーは、Adobe サポート センターのダウンロード ページで見つけることができます。これは、標準の Flash Player のダウンロード ページとは異なります。