1

.swfファイルが変更されたときにファイルを再生して、新しいコンテンツでプレーヤーをリロードする必要があります。悲しいことに、私が選んだプログラムはファイルの変更を監視しません。少し複雑な解決策を思いつきました:

sudo apt-get install incron gtk-gnash
echo "my_username" | sudo tee -a /etc/incron.allow # allow my_username to run incron
incrontab -e

以下を incrontab に追加します。

/home/my_username/path/myfile.swf IN_MODIFY /home/my_username/path/run.sh

run.sh含まれています:(もchmod 700 run.sh

#!/bin/sh
killall gtk-gnash
gtk-gnash /home/my_username/path/myfile.swf

ご覧のとおり、これはエレガントとはほど遠いものです。他にどうすればいいですか?

それがあなたにとって重要な場合、これはUbuntu 12.04にあります。これはaskubuntuに関する私自身の質問の複製です

編集:明確化、私はスタンドアロン プレーヤーである gtk-gnash を使用することにしました。これは必須ではありません。Web ブラウザーも同様ですが、必要ではないようです。

4

1 に答える 1

2

あなたが説明しているのは、ファイル変更モニターの仕事です。

まず、シェルから起動していることを考えると、既存の「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 つのヒント: Adob​​e のスタンドアロン Flash プレーヤー (「プロジェクター」) は、gtk-gnash よりも信頼性が高く、互換性があることが常にわかっています。Adobe のスタンドアロン プレーヤーは、Adobe サポート センターのダウンロード ページで見つけることができます。これは、標準の Flash Player のダウンロード ページとは異なります。

于 2012-10-17T17:59:27.170 に答える