답변:
선입 선출 파이프를 사용하십시오.
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 -X logfile /tmp/something
; screen -X log on
; screen -X stuff "command param"
; screen -X log off
그 시나리오에서 더 잘 작동합니다.
screen
합니까? 이것이 자식 프로세스를위한 것이 아닙니까?