2016-07-15 8 views
0

Linux 화면 유틸리티에서 PHP 래퍼 클래스를 만들려고합니다. 이름으로 화면 세션을 시작하고 생성 된 화면의 PID를 다시 가져올 수 있어야합니다.Linux 화면 만들기 세션 및 해당 PID를 얻으십시오

세션 이름이 고유 한이라고 가정 할 수 없으므로 session -ls 출력을 구문 분석하여 PID를 찾을 수 없습니다. 그것은 같은 PID를 가지고 있으므로,

screen -D -m -S 'screen_name' 2>&1 & 

-D 매개 변수는 프로세스를 포크하지 화면을 알려줍니다 : 인터넷의 주위에 예과 제안을 바탕으로

, 나는 PHP의 exec() 기능을 사용하여 다음과 같은 방법을 시도 백그라운드 프로세스. 내가 실행할 때 (즉시 종료) 리눅스 쉘에서

이 명령은 작동하지만 :

그래서, 나는이 형식에있는 & 배경 쉘 연산자의 출력에서 ​​PID를 구문 분석 할 수 그것은 PHP에서 그것은 동결하고 브라우저는 페이지를로드하지 마십시오.

나는 PHP의 exec()와 shell_exec() 모두와 함께 실행 해 보았습니다.

나는 또한 HERE과 같은 명령의 마지막 부분과 많은 다른 조합을 시도했다.

편집 : 내가이 명령을 사용하는 경우

:

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & 2>&1 
다음

는 PHP exec() 작품. 그것은 화면 세션을 시작하지만 그때 나는 & 백그라운드 운영자로부터 어떤 결과도 얻지 못합니다. 나는 stdoutstderr/dev/null으로 리다이렉트하고 있기 때문에 그것이라고 가정하고있다. 그러나 내가 알고있는 한, 화면 명령에 대해서만해야한다. & 연산자가 아니다.

거의 다 해결 방법 :

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $! 

나는 & 배경 사업자의 단말기에 표시 텍스트가 실제로 명령의 표준 출력 또는 표준 오류에서 오는되지 않았 음을 깨달았다. 그것을 표시하는 쉘입니다. 그래서 & 연산자 뒤에 echo $!을 추가하여 마지막 명령으로 생성 된 프로세스의 PID를 출력합니다.

이것은 터미널에서 작동하며 올바른 PID를 인쇄합니다. 그러나 PHP에서 실행될 때 실제 화면 PID 값은 echo에 의해 반환 된 값보다 4가 더 큽니다. & 연산자 전에 에코가 실행되는 것과 같습니다. 기다릴 수있는 방법이 있습니까?

SOLUTION : I sudo는 상기 명령을 배치하고, 배경 연산자 Sudo 명령 대신 스크린 명령에 작용 하였다

.명령 인수를 벗어 났는지 확인하십시오! :)

+0

물론 PHP는 정지 할 것입니다. 실행중인 외부 앱이 종료 될 때까지 차단하는'exec' 호출을했습니다. 화면이 종료되거나 반환되지 않습니다. 즉, 첨부/실행 상태를 유지하도록 말한 것이므로 exec()가 돌아 오기를 기다리는 전체 PHP 스크립트가 멈추고 화면이 종료되거나 분리 될 때까지 반환되지 않습니다. –

+0

그건'-D' 매개 변수의 의미가 아닙니다. 그것은'screen'에게 오래된 화면 세션을 분리하도록 지시합니다. – Barmar

+0

@MarcB하지만 그는 '&'를 사용하여 백그라운드에서 실행하고 있으므로 명령을 기다리지 않고 즉시 쉘을 종료해야합니다. – Barmar

답변

0

거의 다 해결 방법 :

screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $! 

은 내가 & 배경 연산자에서 터미널의 텍스트를 보여주는 실제로 명령의 표준 출력 또는 표준 오류에서 오는되지 않았 음을 깨달았다. 그것을 표시하는 쉘입니다. 그래서 & 연산자 뒤에 echo $!을 추가하여 마지막 명령으로 생성 된 프로세스의 PID를 출력합니다.

이것은 터미널에서 작동하며 올바른 PID를 인쇄합니다. 그러나 PHP에서 실행될 때 실제 화면 PID 값은 echo에 의해 반환 된 값보다 4가 더 큽니다. & 연산자 전에 에코가 실행되는 것과 같습니다. 기다릴 수있는 방법이 있습니까?

SOLUTION : I sudo는 상기 명령을 배치하고, 배경 연산자 Sudo 명령 대신 스크린 명령에 작용 하였다

. 명령 인수를 벗어 났는지 확인하십시오! :)

- Bradley Odell