분리 된 화면으로 명령 전송 및 출력


12

분리 된 스크린 세션에 명령을 보내는 방법을 찾고 있습니다. 여태까지는 그런대로 잘됐다. 이것이 내가 생각해 낸 것입니다.

$ screen -S test -p 0 -X stuff 'command\n'

이 명령은 정상적으로 작동합니다. 그러나 나는 그것의 출력도 원하고 내 눈앞에서 바로 울려 퍼졌습니다 ( .log파일이나 무언가 가 필요하지 않고 출력 만 원합니다).

screen -L명령을 사용하는 것은 옵션이 아닙니다.


왜 그래야 screen합니까? 이것이 자식 프로세스를위한 것이 아닙니까?
— Anko

답변:


10

선입 선출 파이프를 사용하십시오.

mkfifo /tmp/test

리디렉션 연산자를 사용하십시오. 다음과 같이 명령 출력을 / tmp / test로 리디렉션하십시오.

screen -S test -p 0 -X stuff 'command >/tmp/test\n'

그런 다음 다른 껍질에서

tail -f /tmp/test.

2> & 1 연산자를 사용하여 오류 메시지를 리디렉션 할 수도 있습니다 .

예

의견에서 요청한대로 사용자 입력을 수락하고 "상태"입력에 서버로드를 인쇄하는 PHP 스크립트가 있다고 가정 해 봅시다.

# cat test.php
<?php
  $fp=fopen("php://stdin","r");
  while($line=stream_get_line($fp,65535,"\n")) 
  {
    if ($line=="status") {echo "load is stub";} 
  } 
  fclose($fp);
?>

두 개의 fifo를 만듭니다.

 # mkfifo /tmp/fifoin /tmp/fifoout

당신은 화면을 호출

screen

다른 콘솔에서 콘솔 2라고 부르고 화면 이름을 찾으십시오.

# screen -ls
There is a screen on:
        8023.pts-3.tweedleburg  (Attached)
1 Socket in /var/run/screens/S-root.

콘솔 2에서 명령을 화면에 보냅니다.

 # screen -S 8023.pts-3.tweedleburg -p 0 -X stuff 'php test.php </tmp/fifoin >/tmp/fifoout\n'

화면에 명령이 나타납니다. 이제 콘솔 2에서 PHP 프로세스에 명령을 보낼 수 있습니다.

echo "status" >/tmp/fifoin

그리고 그것을 읽으십시오 :

# cat /tmp/fifoout
load is stub

1
죄송하지만 작동하지 않습니다. 'command> / tmp / test'와 같은 명령을 creen에 보내면 프로세스는> / tmp / test 구문을 지원해야합니다 ... 그렇지 않습니다.
— Robin

나를 위해 작동합니다. 화면 이름으로 "test"를 입력했습니다. screen -ls 명령으로 화면 이름을 찾을 수 있습니다. 또한 "명령"은 실제 명령으로 대체해야합니다. ls 명령으로 테스트했습니다. 또한 bash 쉘로 테스트했습니다.
— Thorsten Staerk

알아 그리고 작동하지 않습니다. 예를 들어, 화면 창에서 PHP 스크립트를 시작하십시오. 예를 들어 현재 서버로드를 반환하는 "status"명령에 응답합니다. 그것이 내가하려는 일입니다.
— Robin

다음은 양방향 파이프가 필요합니다, 나는 내 대답이를 추가하고
— 토르스텐 Staerk

6

수많은 분리 된 화면 세션을 추적하고 각 세션의 출력을 캡처하는 python 스크립트가 있습니다 ( free, top -bn2, iostat 와 같은 활용 명령 이 'stuff'를 통해 주기적으로 전송되는 경우).

파일로 리디렉션하지 않고 분리 된 화면 세션 당 최소 하나의 파일을 관리하는 대신 ... 부모 세션에서 사용하는 tty / pt로 리디렉션합니다.

1 단계 : 분리 모드에서 새 화면 세션 (사람이 읽을 수있는 이름으로)을 시작하십시오.

$ screen -dmS chad 

2 단계 : 명령을 보내십시오 ( 'uname -r'과 함께 'free -g'명령을 사용하겠습니다). -p를 사용하여 사용하려는 창 (이 경우 첫 번째이자 유일한 창)을 지정하는 것이 중요합니다.

$ screen -r chad -p0 -X stuff "free -g; uname -r" 

3 단계 : 위 단계는 명령 텍스트 만 보냅니다. 쉘이 명령을 실행하도록 분리 된 스크린 세션으로 캐리지 리턴을 보내야합니다. ASCII 문자 015는 대부분의 * nix 시스템에서 캐리지 리턴입니다.

$ screen -r chad -p0 -X eval "stuff \015"

4 단계 : 분리 된 스크린 세션의 출력을 현재 tty / pts로 리디렉션하십시오.

$ screen -r chad -p0 -X hardcopy $(tty)

4 단계의 결과는 다음과 같습니다.

$ free -g; uname -r
             total       used       free     shared    buffers     cached
Mem:             7          1          6          0          0          0
-/+ buffers/cache:          0          7
Swap:            1          0          1
2.6.32-358.el6.x86_64

약간 복잡해 보이지만 프로세스는 쉽게 스크립팅 가능합니다. 파이썬을 사용하면 4 단계의 결과를 구문 분석하고 관심있는 데이터 만 캡처 할 수 있습니다.

IP 세부 정보를 얻는 것과 같은 간단한 시나리오를 선택하면서 위의 개념을 보여주는 예제 스크립트를 작성했습니다. 적합하다고 생각되면 교체하고 땜질하십시오.

분리 된 스크린 세션에서 IP 세부 정보를 가져 오는 Python 스크립트 예 :

#!/usr/bin/python

import pexpect, time

#spawn a new bash session
session = pexpect.spawn('/bin/bash')
#send screen commands
session.sendline('screen -dmS netIP')
session.sendline('screen -r netIP -p0 -X stuff "ifconfig eth0 | grep -v eth0 | head -1"')
session.sendline('screen -r netIP -p0 -X eval "stuff \\015"')
#give the command a chance to execute before reading the output of our detached screen
time.sleep(0.1)

#use the output of the uname command as our string to expect
session.sendline('screen -r netIP -p0 -X hardcopy $(tty); $(uname)')
session.expect('Linux')

#parse the output - only concerned with the 'inet' line
output = session.before.split('\n')
for o in output:
    if 'inet' in o:
        print o

#kill the screen
session.sendline('screen -r netIP -p0 -X quit')
time.sleep(0.1)

session.close()

작동중인 스크립트 :

$ python screen-output-test.py 
      inet addr:192.168.1.201  Bcast:192.168.1.255  Mask:255.255.255.0

이 답변은 "쉘 프롬프트"상태 인 화면에 의존하지 않지만 해당 화면에서 실행중인 모든 작업에서도 작동하기 때문에 허용 된 답변보다 훨씬 더 좋습니다.
— 트람 Blohm 모니카 지원

그러나 화면에 맞게 출력을 요구합니다. 나는 찾았다 screen -X logfile /tmp/something; screen -X log on; screen -X stuff "command param"; screen -X log off그 시나리오에서 더 잘 작동합니다.
— Guntram Blohm은 Monica를

-1
screen -S myscreen

screen -R myscreen -X exec command

예:

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