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


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.