분리 된 화면으로 명령 전송 및 출력 정상적으로 작동합니다. 그러나 나는 그것의 출력도 원하고

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

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

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

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



답변

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

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


답변

수많은 분리 된 화면 세션을 추적하고 각 세션의 출력을 캡처하는 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


답변

screen -S myscreen

screen -R myscreen -X exec command

예:

screen -R myscreen -X exec top


답변