2012-10-17 2 views
1

.swf 파일을 재생 한 다음 파일을 변경하여 새 콘텐츠로 플레이어를 다시로드해야합니다. 안타깝게도, 필자가 선택한 프로그램은 변경 사항을 모니터하는 파일을 만들지 않습니다.파일 변경시 이미 열려있는 파일을 다시로드하십시오.

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

run.sh이 포함되어 있습니다 : (가) incrontab에 다음을 추가

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

을 : 나는 조금 복잡한 솔루션을 함께했다 (또한 chmod 700 run.sh)

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

당신이 볼 수 있듯이 멀리 우아한입니다. 어떻게 내가 이것에 관해 갈 수 있냐?

이것은 당신에게 중요한 경우 우분투 12.04에 있습니다. 이 askubuntu에 내 자신의 question의 중복

편집 : 설명, 나는, 독립형 플레이어, 이것이 필요하지 않습니다가, 웹 브라우저도 할 것 GTK-악물다를 사용하기로 결정하지만, 필요하지 보인다

+0

주기적으로 업데이트를 확인하는 SWF 래퍼 내에서 기존 SWF를 시작하고 업데이트가 있는지 확인한 후 하위 SWF를 다시로드합니까? SWF를 생성 할 수 있습니까? 아니면 솔루션이 서버 기반이어야합니까? (SWF 래퍼를 사용하여 설명한 작업을 수행하는 JavaScript 처리기는 어떻게됩니까?) 문제는 이미 클라이언트가 다운로드 한 항목을 서버가 서버로 푸시하는 것보다 클라이언트가 변경 사항을 폴링하는 것이 훨씬 쉽다는 것입니다. SWF를 닫고 연결을 닫습니다. – ghoti

+0

다른 bash 스크립트에서 SWF를 직접 생성하고 이미 재생중인 swf를 교체합니다. 새 콘텐츠를 사용할 수있을 때마다 이런 일이 발생합니다. 이것은 모두 로컬에서 수행되며 출력 SWF는 일부 복도에서 화면에서 재생됩니다. JS 래퍼가 브라우저 내에서 스크립트가되어야한다는 것을 이해한다면, JS는 디스크 변경 사항을 인식 할 수 없으며 주기적으로 다시로드하기 만하면된다 (약간의 성능 문제). 또한 나는 JS에 익숙하지 않고 그렇게 유지하고 싶다.) (필자는 불필요한 합병증으로 생각한다. 더 간단한 해결책이 있어야한다.) – bartekbrak

+0

그러면 독립 실행 형 플레이어에서이 SWF를 시작할 수 있습니까? 그것은 유용한 정보 였을 것입니다. 이 경우 플레이어를 반복하여 실행하고 변경 사항을 감시하는 별도의 프로세스를 통해 변경 사항이있는 경우 플레이어를 강제 종료 할 수 있습니다. 이 말을 듣고 나면 대답을 게시 할 것입니다. – ghoti

답변

2

당신이 말하는 것은 File Alteration Monitor의 직업입니다.

먼저 쉘에서 물건을 출시한다는 점에서 기존의 "incrontab"솔루션이 좋은 출발점입니다. incrontab이 inotify(7) 기반 솔루션이라는 사실은 큰 장점입니다. 즉, 폴링 중이 아니기 때문에 CPU를 절약 할 수 있습니다.

셸 및 시스템 수준의 솔루션을 요구하고 있으며 저는 플래시 프로그래머가 아니므로 귀하의 질문에 충실 할 것입니다. 더 나은 솔루션은 플래시 래퍼를 만드는 것이라고 생각합니다. AS3 로더 클래스를 사용하여 기존 SWF를 빨아 들이고 incrontab에서 시작한 알림을받을 수 있습니다. 플래시 프로그래밍은이 답변의 범위를 벗어났습니다.하지만 더 우아한 솔루션을 제공 할 수도 있습니다.

그래서 ...

현재 방법은 먼저 기존의 gtk-gnash 프로세스는 다음 새로운 하나를 실행 죽이는 시작 스크립트로 구성되어 있습니다. incrontab이 파일을 변경하면 파일이 처음부터 다시 시작됩니다. Flash 응용 프로그램이 충돌을 일으키거나 종료하지 않을 것이라는 점과 항상 완벽한 타이밍을 유지한다면 믿을만한 솔루션입니다. 한 가지 문제는 한 프로세스의 종료와 다음 프로세스의 시작 사이에 알 수없는 지연이 있다는 것입니다. 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 단순히 기존의 프로세스를 죽일 수 있습니다 :

더 나은 솔루션은 루프 내에서 SWF를 시작 단순히 수 있습니다 발사에서 killall는 분리하여

/home/my_username/path/myfile.swf IN_MODIFY killall gtk-gnash 

을, 당신 이전의 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를 임시 파일에 저장할 수도 있습니다.

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

당신은 킬/재시작의 볼 수 영향을 줄이기 위해 고용 수있는 또 다른 전략하는을하는 것입니다 여기에 플래시 플레이어 래퍼의 다른 걸릴입니다 내용이 거의 없거나 전혀없는 상태에서 myfile.swf의 스크린 샷을 만든 다음 플레이어의 바탕 화면 배경 무늬로 사용하십시오. (또는 그와 동등한 것으로, 내가 어떻게 설정하는지 모르겠습니다.) 몇 년 전에 설정 한 디지털 간판 솔루션과 비슷한 것을했습니다. 때때로 독립형 플레이어를 죽이고 다시 시작해야하기 때문에 우리는 첫 번째 페이지의 "프레임"을 만들었습니다. 우리가 플래시 플레이어 프로세스를 죽였을 때,이 시스템은 상자에 내용물이없는 상태로 재설정 된 것처럼 보였으며 ... 잠시 후 내용이 표시되었습니다. (예, 해킹입니다.)

다른 팁 : 필자는 항상 어도비의 독립형 플래시 플레이어 ("프로젝터")가 gtk-gnash보다 더 안정적이고 호환이 가능하다는 것을 알고있었습니다. Adobe의 독립 실행 형 플레이어는 표준 Flash Player 다운로드 페이지와 다른 Adobe Support Centre Download Page에서 찾을 수 있습니다.

+0

감사합니다. 이것은 철저한 대답입니다. 또한 슬프게도 프로젝터 팁에 감사드립니다. Adobe는 Adobe입니다. 명령 줄을 제대로 지원하지 않으며 (심지어 전혀?), 심지어는 전체 화면 인수도 아니며 해결 방법 (쉽지만, 여전히), 그네는 충분해야합니다. – bartekbrak

+0

전체 화면 기능은 플래시 내에서 제어됩니다. 메인 타임 라인에서 첫 번째 프레임에 다음을 포함시킵니다 :'fscommand ("fullscreen", "true");'. 이것은 AS2에서 나를 위해 일했습니다.AS3에서는 Stage 클래스의 displayState 속성을 사용한다고 생각합니다 :'stage.displayState = StageDisplayState.FULL_SCREEN;'자세한 정보는 [여기]입니다. (http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS2E9C7F3B- 6A7C-4c5d-8ADD-5B23446FBEEB.html). – ghoti

+0

pdf2swf를 사용하여 많은 pdfs를 연결하여 swf를 만들었으므로 다른 이야기가됩니다. – bartekbrak

관련 문제