сделать программу перезагрузить уже открытый файл при смене файла

Мне нужно воспроизвести файл .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

EDIT: пояснение, я решил использовать gtk-gnash, автономный плеер, это не требуется, веб-браузер тоже будет делать, но, похоже, не нужен

    То, что вы описываете, – это работа Монитора изменения файлов .

    Во-первых, ваше существующее решение «incrontab» является хорошей отправной точкой, учитывая, что вы запускаете вещи из оболочки. Тот факт, что incrontab является решением inotify (7), является огромным плюсом. Это означает, что вы не проводите опрос, что экономит процессор.

    Вы просите решения для оболочки и системного уровня, и я не программист Flash, поэтому я буду придерживаться вашего вопроса, хотя я считаю, что лучшим решением будет создание Flash-обертки, которая, возможно, использует AS3 Класс загрузчика, чтобы сосать существующий SWF и получать уведомления от чего-то, запущенного incrontab. Flash-программирование выходит за frameworks этого ответа, хотя может предложить более элегантное решение.

    Так…

    Ваш текущий метод состоит из сценария запуска, который сначала убивает любой существующий процесс gtk-gnash затем запускает новый. Он перезапускается с нуля, когда incrontab видит изменение файла. Это жизнеспособное решение, если вы доверяете, что ваше флеш-приложение никогда не будет терпеть крах и не выйти, и если у вас всегда будет идеальный выбор времени. Одна из проблем заключается в том, что у вас есть неизвестная задержка между смертью одного процесса и началом следующего. Ваш 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 не запускается до тех пор, пока старый не завершит работу и не вернет управление оболочке, завершающей ее.

    Конечно, вместо использования incrontab вы также можете установить пакет inotify-tools и оставить цикл:

     #!/bin/sh while inotifywait -e modify /home/my_username/path/myfile.swf; do killall gtk-gnash done 

    Такие же системные вызовы, один и тот же эффект, разные интерфейсы.

    Если вы хотите быть осторожным в том, какой процесс вы убиваете, вы также можете сохранить pid gtk-gnash во временном файле. Вот еще один пример обложки флеш-плеера:

     #!/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 

    Другая страtagsя, которую вы можете использовать для уменьшения видимого эффекта kill / restart, заключается в том, чтобы сделать снимок экрана myfile.swf, когда он работает с минимальным или отсутствующим контентом, а затем использовать его как обои для рабочего стола на проигрывателе. (Или эквивалент, я не знаю, как вы настроены.) Я сделал что-то подобное для решения для цифровых вывесок, которое я создал несколько лет назад - время от времени нам нужно было убивать и перезапускать автономного игрока, поэтому мы сделали только «рамку» первой страницы, которая появляется. Когда мы убили процесс flashplayer, система «казалась» сбрасываемой без содержимого в своих ящиках ... а потом, спустя секунду, появится контент. (Да, это взломать.)

    Еще один совет: я всегда считал автономный Flash-плеер Adobe («Проектор») более надежным и совместимым с gtk-gnash. Вы можете найти автономный проигрыватель Adobe на странице загрузки Центра поддержки Adobe , которая отличается от стандартной страницы загрузки Flash Player.