
GNU Screen을 연결하지 않고 "가상" 터미널을 생성하고, 그 내부에서 스크립트를 실행하고, 스크립트가 끝난 후 세션을 종료하지 않도록 강제하려고 합니다.
나는 다음을 포함하여 많은 조합을 시도했습니다.
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
또는
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
그러나 그들 중 누구도 작동하지 않습니다. 스크립트가 실행되지 않는 세션이 발생하거나, 스크립트가 실행되지만 세션이 완료되면 세션이 종료되거나, "스크린 세션을 찾을 수 없음" 오류가 발생합니다.
내가 기본적으로 원하는 것은 PHP로 작성된 UDP 리스너를 실행하고 (리스닝을 중단하지 않고) 무한 루프에서 작동하도록 하는 것입니다. 예 - &
마지막에 PHP 스크립트를 실행하여 PHP CLI가 데몬으로 실행되도록 할 수 있습니다. 문제는 제가 Server(QNAP - 절대 사지 마세요!)라는 쓰레기를 사용하고 있는데 이를 무시하는 것 같다는 것입니다. SSH 세션에서 로그아웃하면 스크립트가 중지됩니다.
그래서 screen
이것이 유일한 선택인 것 같습니다. 하지만 실행된 명령이나 스크립트가 끝나면 왜 세션을 종료하는지 이해할 수 없습니다.
편집하다:인터넷에서 찾은 예제도 시도해 보았습니다.
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
부족함이 없습니다! ( )를 추가해 보니 screen -R name
Midnight Commander가 아직 실행되지 않은 것을 알 수 있습니다. 예제 작성자의 말에도 불구하고 이는 사실입니다.
답변1
스크립트가 완료된 후에도 화면을 계속 바쁘게 유지하려면 창에서 무언가를 계속 실행하면 됩니다. 이 "사물"에 대한 가장 쉬운 옵션은 아마도 대화형 셸일 것입니다. 이를 수행하는 한 가지 방법은 다음과 같습니다( bash
대화형 셸을 선택한다고 가정).
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-dm
: 분리 모드의 실행 화면-S
: 나중에 검색할 수 있도록 화면의 세션 이름을 설정합니다.sh -c '...'
: 단순히 종료되는 스크립트를 실행하는 것이 아니라sh -c
여러 명령을 실행하는 데 사용합니다.exec bash
: 스크립트가 종료되면sh
위의 내용은 대화형 셸( )로 전환되며bash
, 외부에서 종료될 때까지 절대 종료되지 않습니다. 인스턴스가 살아있는screen
한bash
열려 있습니다 .
답변2
sh -c
내 라즈베리 파이 2에서 데비안 7.8을 실행할 운이 없습니다. 그러나 bash -c
그 일을 했습니다:
주문하다:
/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"
답변3
세션을 종료하지 않는 이유는 세션의 출력을 잃지 않기 위해서입니다. 이런 맥락에서 script
저는 리눅스 도구를 생각했습니다.
rm script_session.log
script -e -f -a script_session.log -c "screen /dev/ttyUSB0 115200"
직렬 USB 어댑터를 분리하면 세션이 종료되지만 여전히 읽을 수 있습니다 . 그러나 "script_session.log"에 포함된 이스케이프 시퀀스로 인해 터미널에서 출력이 사라지기 때문에 script_session.log
그렇지 않습니다 . 또는 cat
같은 도구를 사용하여 파일에서 이스케이프 시퀀스를 제거할 수 있습니다.gedit
vi
어쩌면 script
세션을 분리하는 데에도 유용할 수 있습니다 screen
.