我目前正在为一个巨大的平台编写审计脚本。在主脚本中,我们使用陷阱,在其中一个陷阱中,我要求用户清理文件。该脚本在标准输出中没有输出,因此在 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
是子进程。实际上,无论如何,您可能在后台有一个进程。