스크립트에서 (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.