我需要播放.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上的question的副本
编辑:澄清,我选择使用gtk-gnash,一个独立的播放器,这不是必需的,网络浏览器也会这样做,但似乎没有必要
答案 0 :(得分:2)
您所描述的是File Alteration Monitor的工作。
首先,您现有的“incrontab”解决方案是一个很好的起点,因为您是从shell启动的。 incrontab是一个基于inotify(7)的解决方案,这是一个巨大的优势。这意味着您不进行轮询,从而节省了CPU。
你要求shell和系统级解决方案,我不是Flash程序员,所以我会坚持你的问题,虽然我认为更好的解决方案是创建一个Flash“包装器”,也许使用AS3 Loader类来吸收现有的SWF并接收incrontab启动的通知。 Flash编程超出了这个答案的范围,尽管它可能提供更优雅的解决方案。
因此...
您当前的方法包含一个启动脚本,该脚本首先杀死任何现有的gtk-gnash
进程,然后运行一个新进程。当incrontab看到文件发生变化时,它会从头开始重新启动。如果您相信您的闪存应用程序永远不会崩溃和退出,并且您始终拥有完美的计时,那么这是一个可行的解决方案。它的一个问题是你在一个进程的死亡和下一个进程的开始之间有一个未知的延迟。您的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的新实例在旧实例退出并且将控制权返回给包装它的shell脚本之前不会启动。
当然,您可以选择安装inotify-tools
软件包并保持循环运行,而不是使用incrontab:
#!/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
您可能采用的另一种策略来减少kill / restart的可见效果,是在myfile.swf运行时使用最少或没有内容的屏幕截图,然后将其用作播放器上的桌面壁纸。 (或者相当于。我不知道你是如何设置的。)我为几年前建立的数字标牌解决方案做了类似的事情 - 我们不时需要杀死并重新启动独立播放器,所以我们只是出现了第一页的“框架”。当我们杀死flashplayer进程时,系统“似乎”重置,其框中没有内容......然后,一秒钟后,内容将显示出来。 (是的,这是一个黑客攻击。)
另一个提示:我总是发现Adobe的独立Flash播放器(“Projector”)比gtk-gnash更可靠,更兼容。您可以在Adobe Support Centre Download Page找到Adobe的独立播放器,这与其标准Flash Player下载页面不同。