首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使程序在文件更改时重新加载已打开的文件。

使程序在文件更改时重新加载已打开的文件。
EN

Stack Overflow用户
提问于 2012-10-17 12:00:24
回答 1查看 442关注 0票数 1

我需要播放一个.swf文件,然后,当文件被更改,以重新加载播放器的新内容。可悲的是,我选择的程序没有监控文件的变化。我想出了一个复杂的解决方案:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
/home/my_username/path/myfile.swf IN_MODIFY /home/my_username/path/run.sh

run.sh包含:(也是chmod 700 run.sh)

代码语言:javascript
复制
#!/bin/sh
killall gtk-gnash
gtk-gnash /home/my_username/path/myfile.swf

如你所见,这是远远不够优雅的。我还能怎么做呢?

这是在Ubuntu12.04上,如果这对你重要的话。这是我自己在askubuntu上的问题的副本。

编辑:澄清,我选择使用gtk-gnash,一个独立的播放器,这不是必需的,网页浏览器也会这样做,但似乎没有必要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-17 17:59:27

您所描述的是文件变更监控器的工作。

首先,您现有的"incrontab“解决方案是一个很好的起点,因为您是从shell启动的。incrontab是一个inotify(7)-based解决方案,这是一个巨大的好处。这意味着您没有轮询,这节省了CPU。

您要求的是shell和系统级的解决方案,而我不是Flash程序员,所以我将坚持您的问题,尽管我认为更好的解决方案是创建一个Flash“包装器”,它可能使用AS3 Loader类来吸收您现有的SWF并接收由incrontab启动的通知。Flash编程超出了这个答案的范围,尽管它可能提供一个更优雅的解决方案。

所以..。

当前的方法包括一个启动脚本,它首先杀死任何现有的gtk-gnash进程,然后运行一个新的进程。当incrontab看到对文件的更改时,它会从头开始重新启动。这是一个可行的解决方案,如果你相信你的闪存应用程序永远不会崩溃和退出,如果你总是有完美的时机。它的一个问题是,在一个进程的死亡和下一个进程的开始之间有一个未知的延迟。您的killall发送一个信号,gtk-gnash可能会立即响应,或者在暂停之后。稍作停顿,您可能会发现自己在旧的SWF完全消失之前启动了SWF。暂停一段时间后,您可以简短地显示桌面。

更好的解决方案可能只是在循环中启动SWF:

代码语言:javascript
复制
#!/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只杀死现有的进程:

代码语言:javascript
复制
/home/my_username/path/myfile.swf IN_MODIFY killall gtk-gnash

通过将killall与启动分离,确保gnash的新实例在旧实例实际退出并返回包装它的shell脚本的控制之前不会启动。

当然,您可以选择安装inotify-tools包并保持循环运行,而不是使用incrontab:

代码语言:javascript
复制
#!/bin/sh
while inotifywait -e modify /home/my_username/path/myfile.swf; do
    killall gtk-gnash
done

相同的系统,相同的效果,不同的前端。

如果您想要小心您要杀死的进程,也可以将gtk-gnash的pid存储在一个临时文件中。以下是flash包装的另一个例子:

代码语言:javascript
复制
#!/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行:

代码语言:javascript
复制
/home/my_username/path/myfile.swf IN_MODIFY xargs kill < /var/run/gtk-gnash.pid

另一种减少杀死/重新启动的可见效果的策略是,在myfile.swf以极小或没有内容的方式运行时,获取它的屏幕快照,然后将其用作播放器上的桌面壁纸。(或相等者)我不知道你是怎么安排的。)我为几年前建立的一个数字标牌解决方案做了类似的事情--我们不时需要杀死和重新启动一个独立的播放器,所以我们只制作了出现的第一页的“框架”。当我们杀死闪存程序时,系统“似乎”在没有内容的情况下重新设置.然后,一秒钟后,内容就会出现。(是的,是黑客。)

另一个提示:我一直认为Adobe的独立Flash播放器(“投影机”)比gtk-gnash更可靠和更兼容。你可以在Adobe支援中心下载网页上找到Adobe的独立播放器,这与他们的标准Flash下载页面不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12933849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档