如何控制Linux命令管道中的退出顺序?

ogsagwnx  于 2022-12-29  发布在  Linux
关注(0)|答案(1)|浏览(131)

我的剧本:

./app 2&>1 | ./pipelog --filename=run.log

我使用pipelog来旋转应用程序的stdout、stderr日志。
我测试了它,当发送SIGTERM到脚本在关机期间,两个进程同时接收信号:

  • 流水线日志将立即退出。
  • 但这款应用有优雅的关机逻辑,它会等待一段时间才会退出(时间不确定)。

由此产生的问题是,应用程序的最后一个日志不见了。
如何实现pipelog在app退出后退出?
我现在只能在管道日志里睡固定的时间,这并不优雅。

flseospp

flseospp1#

这可能会起作用:

./app 2&>1 | (trap '' TERM; exec ./pipelog --filename=run.log)

这样,pipelog就应该忽略SIGTERM并继续运行,直到它在其输入管道上到达EOF,这将在app退出时发生。
我假设apppipelog都是内部程序,所以我不能完全确定这是否可行,但我可以想到以下几个失败案例,以及如何处理它们:
1.如果app启动了共享其stdout或stderr的守护进程子进程,但没有关闭,那么它们将无限期地保持pipelog的活动状态。如果是这种情况,并且您无法在app中修复它,那么解决方案可能涉及使用PR_SET_CHILD_SUBREAPER的 Package 程序。
1.如果pipelog在EOF时不退出,那么它将无限期地保持活动状态。任何解决方法都必然会涉及争用条件,因此如果是这种情况,您应该在pipelog的代码中修复它。
1.如果pipelogSIGTERM设置了一个信号处理程序,它将覆盖上面的trap,并继续执行以前的操作。如果是这种情况,并且您无法禁用它,那么解决方案可能包括在外部bash脚本中捕获SIGTERM,并手动将其仅发送到app

相关问题