我知道要使用的解决方案
trap your_command EXIT
但我想要的是仅当 bash 由于设置 TMOUT 变量而超时而终止时才运行命令。有什么出路吗?
我的环境:RedHat 7.7
答案1
我看到的唯一选择是将该命令放入您的~/.bash_logout
文件中;如果当前 shell 是登录 shell 并且当前 shell 不是子 shell,则执行该文件。
在里面bash 的源代码,其中读取命令进行评估,它为 的值设置一个警报处理程序TMOUT
:
if (interactive)
{
tmout_var = find_variable ("TMOUT");
if (tmout_var && var_isset (tmout_var))
{
tmout_len = atoi (value_cell (tmout_var));
if (tmout_len > 0)
{
old_alrm = set_signal_handler (SIGALRM, alrm_catcher);
alarm (tmout_len);
}
}
}
那报警处理程序看起来像这样:
static sighandler
alrm_catcher(i)
int i;
{
printf (_("\007timed out waiting for input: auto-logout\n"));
fflush (stdout);
bash_logout (); /* run ~/.bash_logout if this is a login shell */
jump_to_top_level (EXITPROG);
SIGRETURN (0);
}
void
bash_logout ()
{
/* Run our `~/.bash_logout' file if it exists, and this is a login shell. */
if (login_shell && sourced_logout++ == 0 && subshell_environment == 0)
{
maybe_execute_file ("~/.bash_logout", 1);
#ifdef SYS_BASH_LOGOUT
maybe_execute_file (SYS_BASH_LOGOUT, 1);
#endif
}
}
答案2
解决方案在这里找到:
https://stackoverflow.com/questions/58502915/ Differentiate- Between-exit-and-session-timeout
利用 shell 环境变量 PROMPT_COMMAND 并调用自定义函数。在自定义函数中,您可以检查 Shell 空闲是否超时,并确定是否由于超时或 shell 退出而调用陷阱。