X에서 특정 디스플레이의 스크린샷을 자동으로 찍습니다.

X에서 특정 디스플레이의 스크린샷을 자동으로 찍습니다.

두 개의 화면(실제로는 두 개의 "모니터"에 하나의 "화면")이 있는 X를 실행하는 시스템에서 시간 경과를 생성하려면 화면 중 하나의 스크린샷을 어떻게 찍나요?

xrandr출력은 다음과 같습니다(축약됨).

화면 0: 최소 320 x 200, 현재 3840 x 1080, 최대 16384 x 16384
DFP1 연결 끊김(일반 왼쪽 반전 오른쪽 x축 y축)
DFP2 연결 끊김(일반 왼쪽 반전 오른쪽 x축 y축)
DFP3 연결 끊김(일반 왼쪽 반전 오른쪽 x축 y축)
DFP4 연결 끊김(일반 왼쪽 반전 오른쪽 x축 y축)
DFP5 연결 1920x1080+0+0(일반 왼쪽 반전 오른쪽 x축 y축) 598mm x 336mm
   1920x1080 60.00*+ 50.00 59.94 50.00 60.00 59.94  
   [...]
DFP6 연결 끊김(일반 왼쪽 반전 오른쪽 x축 y축)
DFP7 연결 1920x1080+1920+0 (일반 왼쪽 반전 오른쪽 x축 y축) 598mm x 336mm
   1920x1080 60.00*+ 50.00 59.94 50.00 60.00 59.94  
   [...]
CRT1이 연결 해제됨(일반 왼쪽 및 오른쪽 x축 및 y축)

필요하다:

  1. 최소한의 오버헤드
  2. 데스크탑 환경에 독립적
  3. 자동적 인
  4. 이름으로 화면 선택

1, 2, 3은 도구가 명령줄에서 가장 잘 실행된다는 의미입니다.

답변1

ImageMagick은 importXorg 루트 디렉터리의 스크린샷을 자동으로 찍고 -crop필요한 부분만 사용할 수 있습니다. xrandr매개변수를 제공하세요 crop.

import오버헤드를 최소화하려면 스크린샷을 찍을 때마다 표시 이름으로 명령을 쿼리하는 대신 명령을 한 번 구성해야 합니다 .

mapfile -t displays < <(xrandr | grep ' connected')
get_date='`date +"%Y%m%d-%H%M%S"`'
for (( i=0; i<${#displays[@]}; i++)); do
  name=`echo ${displays[i]} | cut -d " " -f 1`
  crop=`echo ${displays[i]} | cut -d " " -f 3`
  echo import -silent -window root -crop ${crop} \"${name}-${get_date}.png\"
done

파일 매핑 및 for 루프에 대한 지침은 다음에서 찾을 수 있습니다.이 문제.

그러면 다음과 같은 명령이 제공됩니다.

import -silent -window root -crop 1920x1080+0+0 "DFP5-`date +"%Y%m%d-%H%M%S"`.png"
import -silent -window root -crop 1920x1080+1920+0 "DFP7-`date +"%Y%m%d-%H%M%S"`.png"

이제 while 루프에서 이를 사용하여 시간 경과(중지 ctrl+c)를 수행할 수 있습니다.

while [ 1 ]; do
  import ...
  sleep 1 # for 1 second delay between screenshots
done

이것이 내가 아는 유일한 방법입니다. 오버헤드가 적은 방법이 있기를 바랍니다.

관련 정보