스크립트에서 (GNU) 화면 실행


11

화면 세션 내에서 스크립트로 일부 응용 프로그램을 시작하고 싶습니다.
스크립트가 없으면 화면을 시작한 다음 crtl-ac로 N 창을 열고 각 창에서 프로그램을 실행합니다.

나는 다음을 시도했다

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

그러나 내가 연결하면 세션 테일이 실행되지 않습니다. 방금 세션을 연결하고 다른 터미널에서 screen -d -m -S startup실행 screen -S startup -X exec tail -f /var/log/messages하면 작동합니다.

내가 뭐 놓친 거 없니 ?

AlexD 답변 후 편집 :

반 작업 솔루션은

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

exec는 화면을 분리 할 때 현재 창이 정의되어 있지 않고 exec는 현재 창이 정의 될 것으로 예상하기 때문에 exec는 명령과 함께 화면 연결 명령 (-X 이후의 명령)이 작동 중일 수 있습니다. 이 팁에 대한 AlexD 에게 감사합니다 .

그러나 이상한 부작용이 있습니다 : 프로그램이 멈 추면 (스크린 세션을 연결하고 꼬리를 죽이거나 꼬리를 죽이면) 화면 창이 닫힙니다.
따라서 동작은 Crtl-A c와 동일하지 않고 명령을 실행합니다.
또 다른 부작용은 2 개의 명령을 연결할 수 없다는 것입니다


screen 항상 이 도구의 정상적인 기능입니다 : 당신이 실행 ..so 경우 -와 명령이 끝을 발사 할 때 종료 screen top, 당신이 종료 할 때 top, screen도 종료됩니다
워렌

예, 이제는 deamon으로 화면을 시작한 다음 exec를 사용하고 screen 명령을 사용하여 새 창을 엽니 다 (쉘을 라우트)하는 이유입니다. 또한 exec와 tail 또는 screen 사이에 tu prepend bash를 시도했지만 말해도 작동하지 않습니다
반경

답변:


14

screen -S test -X screen command명령은 데몬 세션에 창을 추가해야하지만 그 이유는 아닙니다. -X는 쉘 명령이 아닌 화면 명령을 취하고 창을 만들기위한 화면 명령을 혼란스럽게 화면이라고하기 때문에 작동합니다. exec 화면 명령이 없습니다. 쉘 스크립팅을 사용하여 명령을 작성하지 않으면 (예 :) 체인이 없습니다 screen -S script -X screen sh -c 'command1; command2;'.

screen -S test -X screen기본 명령이 쉘이기 때문에 명령없이 호출 하는 것은 쓸모가 없으며 일단 쉘을 생성 한 후에는 해당 쉘 내에서 명령을 실행하는 비 대화식 (의도적) 방법이 없습니다. 대화식 쉘없이 자체적으로 명령을 실행하는 것이 좋습니다. 부작용은 명령이 종료 될 때 화면 창에 더 이상 자식이없고 닫히는 것입니다.

이제 명령이 종료 된 후 어쨌든 창을 열어 두도록 화면에 요청할 수 있습니다. zombie이를 활성화 하려면 screen 명령을 사용하십시오 . 순서는 다음과 같습니다.

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

대화식으로 다시 연결하려면

screen -S script -r

마지막으로 이러한 -X 명령을 screenrc 스크립트로 다시 작성할 수 있습니다.

Screenrc :

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

스크립트:

screen -d -m -S script -c screenrc

예 -X가 화면 명령을 받고 있다는 것을 알고 있습니다. "Chaining screen 명령 (-X 이후의 명령)"이라고 말했을 때의 의미입니다 (아직 명확하지는 않습니다). 페이지에 있지만 비 대화식 모드에서 원하는대로 작동하게하는 방법은 없습니다. 어쨌든 AlexD 솔루션과 좀비 명령 추가로 내가 원하는 것을 얻었습니다! 감사합니다
반경

@Tobu : 좀비를 언급하면 ​​+200! 나는 그 끔찍한 매뉴얼에서 그것을 눈치 채지 못했을 것입니다!
덩굴

6

동일한 효과를 원하면 Ctrl-A c다음 screen대신 사용해야 합니다 exec.

screen -S 테스트 -X screen tail -f / var / log / messages
화면 -S 테스트 -X 화면
screen -S 테스트 -X screen tail -f /var/log/xinetd.log

또한 명령을 위의 $HOME/.screenrc-younameit파일없이 screen -S test -X접두사 없이 이동 screen -c $HOME/.screenrc-younameit하고 특정 화면 세션을 만들 때 시작할 수 있습니다.


Ctrl-A c가 내 세 번째 줄에 있습니다 .exec가 화면을 분리 할 때 정의되지 않을 수있는 현재 창에서 명령을 실행하기 때문에 exec가 작동하지 않는 것 같습니다. 해결 방법 체인 화면과 명령이 훌륭합니다. 시도했습니다! 귀하의 답변에 세션 생성이 부족하고 쓸모없는 라인 (두 번째 줄, 건너 뛰기 1 창)이 있기 때문에 나 자신에게 답변을 추가 할 것입니다.
반경

실제로 예상대로 작동하지 않고 프로그램이 중지되는 즉시 창이 닫힙니다. screen -S test -X screen ls를 수행하면 창이 닫히고 결과가 표시되지 않습니다.
반경

1

byobu 옵션을 사용 하고 있습니까?


방금 시도해 보았습니다. 어떻게 도움이되는지 알지 못하지만 byobu가있는 작업 솔루션이 있으면 괜찮을 수도 있습니다. 스크린 전용 솔루션을 선호하지만 추가 기능을 사용하는 것이 솔루션이없는 것보다 낫습니다!
반경

1

나는 오늘 밤 같은 일을하고 있었고, 미리 열린 여러 파일로 화면을 열고 싶었습니다. 이 모든 것을 알아내는 데 시간이 걸렸지 만 마침내 다음과 같이 잘 작동합니다.


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

이렇게하면 6 개의 서로 다른 화면이 만들어지며 화면 1-5는 다양한 파일을 열었습니다. 나는 모든 세부 사항을 모르지만 'stuff'는 본질적으로 화면에 다음 인용 된 텍스트가 화면 명령이 아니라고 알려줍니다. 그런 다음 '평가'는 따옴표에 포함 된 모든 것을 공개합니다. 이것이 없으면 screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" 인용 된 텍스트를 실행하지 않고 단순히 파이프합니다. Eval은 '\ 015'를 줄 바꿈으로 읽어 앞의 텍스트를 실행합니다.

다른 세부 사항의 관점 screen -p 1 -S CS140 -X CMD 에서 쉘은 'CM140'이라는 화면 세션의 첫 번째 창으로 'CMD'를 보내도록 지시합니다.

희망이 도움이됩니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.