스크립트 실행 후 GNU 화면이 세션을 종료하지 못하도록 방지


34

GNU 화면이 "가상"터미널을 연결하지 않고 강제로 연결하려고 시도하고 내부 스크립트를 실행하고 스크립트가 종료되면 세션을 종료하지 마십시오.

나는 다음을 포함하여 많은 조합을 시도했다.

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

또는

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

그들 중 누구도 일하지 않았습니다. 스크립트를 실행하지 않고 세션을 가져오고 스크립트를 실행하지만 세션이 완료되면 세션이 종료되거나 "No screen session found"오류가 발생합니다.

내가 기본적으로하려고하는 것은 PHP로 작성된 UDP 리스너를 실행하고 무한 루프에서 작동하게하는 것입니다 (듣기 중단하지 마십시오). 예- &마지막에 PHP 스크립트 를 실행하여 PHP CLI를 데몬으로 실행할 수 있습니다. 문제는 서버라는 정크 (QNAP-절대로이 쓰레기를 사지 마십시오!)를 사용하고 있다는 것입니다. 이것을 무시하는 것 같습니다. SSH 세션을 로그 오프하면 스크립트가 중지됩니다.

따라서 screen유일한 옵션 인 것 같습니다. 그러나 명령을 실행하거나 스크립트가 끝나면 세션이 종료되는 이유를 이해할 수 없습니다.

편집 : 인터넷에서 찾은 예제도 시도했습니다.

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

부족하지 않습니다! 첨부 한 후 ( screen -R name) Midnight Commander HASN이 실행되지 않은 것으로 보입니다. 모범 저자가 말했지만 그렇게 될 것입니다.


호출하는 방식에 따라 screen하나의 창만 만들어 단일 명령을 실행할 수 있습니다. 명령이 종료되면 창이 닫히고 screen수행 할 작업이 없으므로 종료됩니다.
jw013

그래서 ... 두 개의 창을 열 수있는 방법이 screen있습니까 (명령 줄만 사용하고 키보드 조합은 사용하지 않음), 하나는 스크립트를 실행하고 다른 하나 는 닫히지 않도록 방지 합니까? BTW : 여전히 아이디어를 얻지 못했습니다! 을 호출 screen -dmS name하면 분리 된 창을 만들며 할 일이 없습니다. 그러나 자동으로 닫히지 않습니다! 그러나 분리 된 화면에서 무언가를 실행하려면 실행이 완료되면 종료됩니다. 왜? 나는 여기에 논리가 보이지 않습니다. 창에 아무것도하지 않을 수 있지만 창에 무언가를 한 다음 아무 것도하지 않을 수 있습니까?
trejder

2
명령을 지정하지 않고 윈도우를 시작하면됩니다 하지 "아무것도하지." 그것이하는 "무언가"는 대화식 쉘을 실행하고 있으며, 수동으로 종료 할 때까지 종료되지 않습니다.
jw013

시원한! 설명해 주셔서 감사합니다! 그래서 ... 다시 질문으로 ... 분리 된 화면 / 창 내에서 명령을 실행하고 명령 실행이 끝나면 세션을 종료하지 않는 방법이 있습니까? 또한 업데이트 된 질문을 살펴보십시오. 고맙습니다.
trejder

이 스크립트는 PHP로 작성된 두 개의 UDP 리스너를 실행하고 있습니다. &QNAP (buggy server)로 인해 둘 다 데몬으로 실행되지만 세션 종료시 종료됩니다 (나는으로 실행하면 일반 Linux에서는 사용해서는 안된다고 들었습니다 &). 따라서 start_udp_listeners.sh완료 후 아무것도하지 않고 세션이 종료되지 않도록하는 방법 만 찾고 있습니다. 그렇지 않은 한 내 PHP 리스너는 정상적으로 작동합니다.
trejder

답변:


42

스크립트가 완료된 후 화면을 바쁘게 유지하려면 창에서 무언가를 지속적으로 실행하십시오. "무언가"에 대한 가장 간단한 선택은 아마도 대화식 쉘일 것입니다. 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있습니다.

1
흠 ... 당신은 내 인생의 구세주 인 것 같습니다! :] export IGNOREEOF=1Ctrl + D를 사용하여 실수로 종료되지 않도록 솔루션을 확장 하면 완벽한 솔루션을 제공 할 수 있습니다. 감사! :]
trejder

이것은 현재 데비안에서 작동하지 않습니다. -c는 대체 .screenrc 파일을 읽는 인수입니다 ...
ToVine

@ToVine은 데비안 스 테이블 (Wheezy)에서 완벽하게 작동합니다. 그래도 사용했습니다 bash -c.
TranslucentCloud

@TranslucentCloud "bash -c ..."전체 명령을 따옴표로 묶었습니까? 내가 그것을 마지막으로 시도했을 때 (의견을 작성하기 직전에) 그것은 효과가 없었습니다. 왜 그런지 잘 모르겠습니다 ...
ToVine

@ToVine 여기 내 모든 명령이 있습니다 :screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

나는 sh -c데비안 7.8을 실행하는 라즈베리 파이 2에서 운이 없었습니다 . 그러나 bash -c일을했다 :

명령:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

다른 쉘을 사용하기 때문에 (Raspberry Pi에서) 가능합니까? bashsh두 개의 서로 다른 쉘 것 같다. 그게 전부라고 생각하지만 Linux를 전혀 모르기 때문에 틀릴 수도 있습니다.
trejder

1
sh는 기본 유닉스 쉘이며 raspbian (debian)에 포함되어 있습니다. sh 명령도 작동하지만 화면과 함께 sh -c는 작동하지 않습니다.
scotty86

@ scotty86에게 감사드립니다 .Linux Mint 19 (Ubuntu 18.04)에서도 마찬가지였으며 트릭을 변경 sh -c했습니다 bash -c. 나는 이유를 이해하지 않는, 모두 shbash나는 아직도 잠을 잃고, 그래서 설치되어 있지만, 적어도 그것을 작동합니다.
Redsandro

sh아마 /bin/dash대신에 가리 킵니다 /bin/bash. 데비안에서 기본 쉘을 전환 bashdash몇 년 전.
scai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.