我想设置一个脚本来记录终端活动。在寻找各种来源后,我想到了使用 Script 命令来执行此任务。但是,如果我只使用脚本命令,例如:script - a /var/log/session/terminal.log
我必须exit
每次手动键入以停止script
命令并完成记录。我尝试使用timeout
设置script
命令的执行时间,但该script
命令实际上被信号杀死,并且记录文件留空,没有任何记录。
其实我想设置一个执行时间来记录终端,不断地将内容记录到文件中。此外,如果有人不小心关闭了终端,所有内容将在退出前保存到一个文件中。您能给我一些关于这个问题的建议吗?
非常感激
答案1
该script
命令打开一个新的 shell。因此它像普通 shell 一样退出。定时退出不可用,因为您使用的 shell (IIUC) 是交互式的。它通过“exit”或Ctrl+退出d。
如果输入来自脚本,任何指示文本/传输/输入文件结束的内容也将使 shell 退出。
人们可以使用信号来退出该 shell,但需要一个监督脚本。从bash
手册页:
The shell exits by default upon receipt of a SIGHUP
因此,如果您可以启动一个 shell 并捕获其进程 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