当要求用户输入时强制作业进入前台

当要求用户输入时强制作业进入前台

我目前正在为一个巨大的平台编写审计脚本。在主脚本中,我们使用陷阱,在其中一个陷阱中,我要求用户清理文件。该脚本在标准输出中没有输出,因此在 bg 中运行该脚本是显而易见的。

当向 bg-job 发送 SIGQUIT 时,它会停止,我必须手动将其放在前台才能fg获得提示。

我尝试过的: 我尝试了set -m主动工作控制并将其放入fg我的陷阱功能中。

脚本完成后,我的 shell关闭set -m,如果没有它,我会得到调试输出,表明我的脚本没有作业控制。即使使用set -m,该作业也不会进入前台。

为此,我的问题是:

  • 是否有可能强制作业在某个时刻进入前台?
  • 我知道这不是在脚本中使用作业控制的常见方法。对此的“最佳实践”是什么?
  • 脚本内的作业控制是否仅适用于子 shell/子进程,或者我可以使用它来控制我启动的作业吗?

编辑:screen正如 lcd047 所建议的,使用or 更加优雅tmux,可以保持脚本干净简单。

答案1

脚本内的作业控制是否仅适用于子 shell/子进程,或者我可以使用它来控制我启动的作业吗?

是的。由父 shell 进行作业控制,您不能将子进程从其内部置于前台。

编辑:不过你仍然可以这样做:

  • 子脚本:

    #! /bin/sh
    ...
    trap "kill -s USR1 $PPID" TTOU
    ...
    echo -n Cleanup?
    read yn </dev/tty
    ...
    
  • 父脚本:

    #! /bin/sh
    ...
    trap "fg %1" USR1
    ...
    child &
    ...
    wait
    ...
    

这会SIGTTOU在子级中安装一个信号处理程序,并SIGUSR1在父级中安装另一个信号处理程序。当子进程尝试向终端输出内容时,它会收到一个SIGTTOU.然后,它SIGUSR1向父级发送 a,然后父级运行fg %1并将子级置于前台。

上面假设%1是子进程。实际上,无论如何,您可能在后台有一个进程。

相关内容