첨부하지 않고 화면 작성 및 명령 실행


28

화면 세션에서 실행되는 스크립트를 시작 및 중지하는 유지 관리 루틴 자동화를 위해 노력하고 있습니다. 내 접근 방식은 화면 세션을 종료 한 다음 다시 시작하고 스크립트를 사용하여 화면을 만들고 화면에 연결할 필요없이 명령을 전달하는 기능을 사용하여 스크립트 내에서 명령을 실행하는 것입니다.

그러나 나는 이것에 어려움을 겪고있다. 를 사용하여 첨부하지 않고 화면을 올바르게 만들 수 있습니다 screen -d -m -S screen_name. 그러나 다음을 기반으로 명령을 실행하면 :

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

echo -ne '\ 015'는 작은 따옴표 대신 백틱으로 래핑됩니다. 내가 사용하는 명령이 디렉토리로 이동하고 거기에있는 스크립트를 실행함에 따라 Enter 키를 누르는 사용자를 시뮬레이션하는 것입니다. 이 명령은 작동하지만 화면을 만든 후에 만 ​​연결된 경우에만 작동합니다. 화면을 만들고 화면 내에서 명령을 실행하는 프로세스를 자동화하려고 할 때 스크립트 내에서 연결하거나 분리하지 않아도됩니다. 화면 내에서 실행하고 결과에 따라 편집 해야하는 명령이 포함 된 셸 스크립트를 만들 것을 제안합니다.

하나의 명령으로 또는 화면을 만들지 않고 명령을 실행하기 전에 화면에 첨부하지 않고도 화면을 만들고 화면 내에서 명령을 실행하는 방법이 있습니까?

미리 감사드립니다.

** 업데이트-쉘 스크립트 내에서 실행 해야하는 명령을 배치하기 위해 제안을 시도했지만 화면을 성공적으로 작성하고 화면 내에서 명령을 실행할 수 있었지만 스크립트 실행이 중지되면 동작이 발생합니다. 화면도 닫힙니다. 스크립트가 sys 관리자에 대한 지식이나 개발하려는 스크립트를 통해서만 중지해야하는 로깅 스크립트이므로 문제가되지 않아야합니다. 그러나 화면이 그런 방식으로 화면을 설정하는 것이 좋습니다 스크립트가 중지 된 경우 사라지지 않습니다. 이 동작을 달성 할 수 있습니까? **


1
나는 같은 문제에 부딪 쳤고 superuser.com에서이 문제를 우연히 발견 한 다른 사람을위한 해결책을 찾았습니다. superuser.com/questions/342463/…
Dan Herbert

화면을 열어 두려면 다음과 같이 사용할 수 있습니다. screen bash -c 'echo "test"; / bin / bash '
gwyn

1
자동 결산 문제의 .screenrc경우 줄이 포함 된 스페셜 을 사용하면 zombie kr완성 된 창이 열린 상태로 유지되며를 눌러 창 k을 닫거나 r창에서 명령을 다시 실행할 수 있습니다. 내 기본 .screenrc에 대해 이것을 가지고 있습니다.
Martin C.

답변:


17

여러 가지 문제가 발생할 수 있다고 생각합니다.

다시 연결하기 전에 명령이 완료되면 화면이 사라집니다. 다음을 사용하여이를 데모 할 수 있습니다.

screen -d -m ls -l

ls -l명령 이 실행 되지만 screen -list화면 프로세스가 종료되면 표시되지 않습니다.

또한이 \ 015 물건으로 무엇을하려고하는지 전혀 모릅니다. 아마도 당신이하려고하는 것은 스크린 세션에서 여러 명령을 실행하는 것이므로 질문을 업데이트하는 것이 도움이 될 것입니다. 다음과 같이 간단해야합니다.

screen -d -m bash -c "command1 ; command2 ; command3"

이것들이 많이 사용된다면, 아마도이 명령 만 실행하는 쉘 스크립트를 만들어야하고보다 간단한 것을 사용해야합니다.

screen -d -m /path/to/script.sh

화면을 즉시 분리하지 않고 유사한 동작을 수행하는 방법이 있습니까? ssh 세션을 시작한 다음 바로 분리하고 싶다고 가정 해보십시오. screen -d -m ssh세션이 시작되기 전에 암호 프롬프트에서 분리됩니다.
bright-star

이것은 나를 위해 작동하지 않습니다. "commandN"을 몇 개의 장기 실행 프로그램으로 바꾸면에 아무것도 나타나지 않습니다 screen -list. 또한 OP가 시도하는 것처럼 화면의 이름을 지정하지 않습니다.
Cerin

이 방법을 사용하여 파이썬 프로그램을 실행하려고했습니다. 나는 그것을 실행하기 위해 sh 스크립트를 만들려고했지만 목록에서 화면을 보지 못했습니다. 대신 나는 screen -d -m python EventGenerator.py잘 작동했습니다
Dan Ciborowski – MSFT

1
아마 bash -c "commands"대신 해야합니다bash "commands"
marcovtwout

네 말이 맞아 -c가 있어야합니다.
Xdg 2018

8

분리 된 화면 시작

screen -dmS <screen name>

이전에 생성 된 분리 된 화면에서 명령 실행

screen -S <screen name> -X stuff '<CMD>\n'

예, 명령을 제출하려면 enter 기호를 입력해야합니다. 그렇지 않으면 문자열이 화면에 추가됩니다.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
'물건'이란 무엇입니까?
Nadav B

stuff실제로 다른 명령을 화면 세션에 복사하여 붙여 넣는 명령입니다. stuff [string] 현재 창의 입력 버퍼에 문자열 문자열을 채 웁니다. 이것은 "붙여 넣기"명령과 비슷하지만 오버 헤드가 훨씬 적습니다. 매개 변수가 없으면 화면에 문자열을 입력하라는 메시지가 표시됩니다. "stuff"명령으로 큰 버퍼를 붙여 넣을 수 없습니다. 키 바인딩에 가장 유용합니다. "바인드 키"를 참조하십시오. [ terminallife.com/sending-commands-in-a-screen-session/
alisa

2

전에이 문제가 발생했지만 cygwin 구현의 버그였습니다.

내가 한 것은 다음 명령 만 갖는 ".screenrc_detaching"을 만드는 것입니다.

#detach
detach 

그런 다음

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

그런 다음 스크린 세션이 있고 이미 연결 및 분리되어 있으며 명령을 펌프하는 것이 좋습니다.

쉬워요! :피


2

이것은 -c작동 하지 않고 나를 위해 일을했다

screen -d -m bash -c "command1; command2; command3"


1

이전 답변을 테스트하는 복사하여 붙여 넣기 방법은 다음과 같습니다.

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

예상 결과는 다음과 유사해야합니다.

No Sockets found in /var/run/screen/S-yourusernamehere.

(이것은 이전에 스크린 세션이 생성되지 않았 음을 의미합니다)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(화면을 생성하고 화면을 분리하는 데 소요 된 시간입니다. 거의 즉각적입니다.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(이 출력은 사용 가능한 화면 세션을 보여줍니다. 마지막 명령에서 생성되었습니다.)

sleep 20; cat /tmp/h

(이것은 catgnu-screen에서 실행 된 호스트 이름을 보여줍니다)


그리고 그러한 시험의 결과는 무엇입니까?
Pierre.Vriens

당신이 옳아 요, 예가 없었습니다. 추가하겠습니다.
Enrique S. Filiage 19:43에

훨씬 낫다! 머시! +1
Pierre.Vriens

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