일부 명령을 병렬로 실행하고 있으며 모든 명령이 완료된 후 마지막 출력(터미널 에뮬레이터의 스크롤백에서)을 보고 싶습니다. 이것은 내 테스트 스크립트입니다 test.screen
.
#
screen -t A sh -c 'echo important info && sleep 2'
split
focus
#
screen -t B sh -c 'echo another important info && sleep 5'
시작 명령:
$ screen -c test.screen
산출:
[screen is terminating]
[il@reallin ~]$
--
another important info
1 B
한 가지 문제는 첫 번째 작업이 sleep 2
완료되면 인쇄된 메시지가 important info
삭제된다는 것입니다. zombie kr
처음에 추가 하면 화면이 전혀 종료되지 않습니다. 해결 방법으로 호출자는 모든 화면 프로세스가 종료될 때까지 기다린 다음 발행할 수 있습니다.-X quit
또 다른 문제: 종료 시 캐럿이 맨 아래로 이동하지 않고 screen
쉘 프롬프트가 일부 데이터를 덮어씁니다. 해결책은 echo
$LINES번입니다.
답변1
Screen 종료 시 화면이 지워지지 않게 하려면 대체 화면으로 전환되지 않도록 단말기 설명을 선택(또는 수정)해야 합니다. 이것이 TERM
가치 이다외부 screen
.
xterm(및 PuTTY와 같은 일부)을 사용하면 대체 화면의 사용을 방지하도록 터미널을 구성할 수 있지만 xterm의 대체 화면 기능을 복제하는 대부분의 터미널의 경우 이는 하드 코딩되어 구성할 수 없습니다. 따라서 터미널 설명이 시작점입니다.
ncurses는 대체 화면을 표시하지 않는 터미널 설명 "xterm1"을 제공합니다(그리고 Debian에서 본 적이 있으므로 Ubuntu와 같은 파생 배포판에 있을 수 있습니다). 다른 시스템의 경우 상황에 따라 다릅니다. infocmp와의 차이점은 다음과 같습니다.
comparing xterm1 to xterm.
comparing booleans.
comparing numbers.
comparing strings.
rmcup: NULL, '\E[?1049l'.
smcup: NULL, '\E[?1049h'.
Screen 프로그램에는 일반적으로 꺼지는 대체 화면의 자체 변형도 있습니다.
altscreen on|off
If set to on, "alternate screen" support is enabled in virtual termi‐
nals, just like in xterm. Initial setting is `off'.
추가 자료:
답변2
화면 분할 영역이 지워진 경우에는 좋은 해결책이 없습니다. 좀비 창으로 인해 화면이 종료되지 않습니다. 창과 호출자 스크립트 사이에 추가 동기화를 추가해야 하며, screen -X quit
모두 사라질 때 이를 명시적으로 호출합니다.
이 altscreen
명령은 이것과 아무 관련이 없습니다. 내 기본 설정이 반 작동하기 때문에 커서가 맨 아래로 이동하지 않습니다 /etc/screenrc
. 호스트 터미널 altscreen 기능이 사용되지만 다시 전환하기 전에 altscreen이 지워지지 않습니다. 기본적으로 작동하도록 하기 위해 /etc/screenrc
에서 복사 했고 CentOS 7
제 경우에는 기능을 완전히 비활성화했습니다 termcapinfo * ti=:te=
.
테스트.sh:
#!/bin/bash
# set -e
if [ "a" = "$1" ]; then
# decrement file name towards zero, then kill screen
set -e
a=-1
cd "$COUNTERDIR"
while true; do
for old in *; do
new=$((old + a))
done
[ 0 -eq "$a" ] || 2>/dev/null mv ./$old ./$new && break
done
if [ 0 -eq "$new" ]; then
screen -X quit
fi
exit
fi
NWINDOWS=2
COUNTERDIR=`mktemp -d`
touch "$COUNTERDIR/$NWINDOWS"
export COUNTERDIR
screen -c test.screen
rm -rf "$COUNTERDIR"
테스트 화면:
# do not use host terminal altscreen feature
termcapinfo * ti=:te=
# windows stay after command terminates
zombie kr
screen -t A sh -c 'for ((i=0; i<100; i++)); do echo important info $i; done && sleep 5; ./test.sh a'
split
focus
screen -t B sh -c 'for ((i=0; i<100; i++)); do echo another important info $i; done && sleep 2; ./test.sh a'