터미널 활동을 기록하기 위한 스크립트 명령의 실행 시간 설정

터미널 활동을 기록하기 위한 스크립트 명령의 실행 시간 설정

터미널 활동을 기록하는 스크립트를 설정하고 싶습니다. 다양한 소스를 살펴본 후 이 작업을 수행하기 위해 스크립트 명령을 사용하는 아이디어가 떠올랐습니다. 그러나 예를 들어 스크립트 명령만 사용하는 경우 명령을 중지하고 녹음을 마치려면 매번 수동으로 입력 script - a /var/log/session/terminal.log해야 합니다 . 명령의 실행 시간 설정을 사용해 보았지만 명령이 실제로 신호에 의해 종료되고 로깅 파일은 아무것도 기록되지 않은 채 비어 있습니다.exitscripttimeoutscriptscript

실제로는 실행 시간을 설정하여 터미널에 로그를 남기고 지속적으로 내용을 파일에 로그하고 싶습니다. 또한 누군가 실수로 터미널을 닫은 경우 종료하기 전에 모든 것이 파일에 저장됩니다. 이 문제에 대해 조언을 좀 해주실 수 있나요?

고마워하는

답변1

script명령은 새 셸을 엽니다. 따라서 일반 쉘처럼 종료됩니다. 사용 중인 쉘(IIUC)이 대화형이므로 시간 초과 종료를 사용할 수 없습니다. "exit" 또는 + 를 통해 Ctrl종료됩니다 d.

입력이 스크립트에서 오는 경우 텍스트/전송/입력 파일의 끝을 나타내는 모든 내용으로 인해 셸이 종료됩니다.

신호를 사용하여 셸을 종료할 수 있지만 감독 스크립트가 필요합니다. bash매뉴얼 페이지 에서 :

The shell exits by default upon receipt of a SIGHUP

따라서 쉘을 시작하고 해당 프로세스 ID를 캡처할 수 있으면 쉘이 완전히 중지됩니다.

kill -HUP $SHELLPID

이 작업을 수행하는 스크립트는 다음과 같습니다.

#!/bin/bash

date=`date +%Y-%m-%d-%H%M`
logfile=`mktemp /tmp/terminal-log-${date}-XXX`

# call shell - try gnome-terminal if you prefer it
# gnome-terminal -- /usr/bin/script --quiet $logfile
xfce4-terminal --execute /usr/bin/script --quiet $logfile

ourpid=`readlink /proc/self`
scriptpid=`ps auxfw | grep -w $logfile | grep -v grep | awk '{print $2}'`
shellpid=`ps auxfw | grep -w --after=1 $logfile | grep -w --after=1 $scriptpid | tail -1 | awk '{print $2}'`

# feel free to delete this debug output
echo terminal started, script pid is $scriptpid, shell pid is $shellpid 

# sleep before stopping the shell - adjust time freely
sleep 10m

# flush script, just to be sure
kill -SIGUSR1 $scriptpid

# kill shell (cleanly, script and terminal should exit, too)
kill -HUP $shellpid

관련 정보