当 bash 由于超时而关闭时运行命令

当 bash 由于超时而关闭时运行命令

我知道要使用的解决方案

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);
}

bash_logout函数定义为

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 退出而调用陷阱。

相关内容