簡體   English   中英

Linux命令pipe中的退出順序如何控制?

[英]How to control the exit order in Linux command pipe?

我的腳本:

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

我使用 pipelog 來循環應用程序的 stdout、stderr 日志。

我測試了一下,在關閉期間向腳本發送 SIGTERM 時,兩個進程同時收到信號:

  • 管道日志將立即退出。
  • 但是app有優雅關閉邏輯,會等待一段時間再退出(時間不定)。

由此產生的問題是app的最后一個日志沒有了。

如何實現app退出后pipelog退出?

我現在只能在 pipelog 中休眠一段固定的時間,這很不優雅。

這可能會起作用:

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

這樣, pipelog應該忽略SIGTERM並繼續運行,直到它在其輸入 pipe 上到達EOF ,這將在app退出時發生。

我假設apppipelog都是內部程序,所以我不能完全確定這是否有效,但這里有一些我能想到的失敗案例以及如何處理它們:

  1. 如果app啟動共享其 stdout 或 stderr 的守護進程子進程,但在它關閉時不關閉,那么它們將無限期地保持pipelog活動。 如果是這種情況,並且您無法在app中修復它,那么解決方案可能涉及使用PR_SET_CHILD_SUBREAPER的包裝程序。
  2. 如果pipelog沒有在 EOF 上退出,那么它將無限期地保持活動狀態。 對此的任何解決方法本質上都會涉及競爭條件,因此如果是這種情況,您應該在pipelog的代碼中修復它。
  3. 如果pipelogSIGTERM設置了一個信號處理程序,它將覆蓋上面的trap並繼續做它以前做的事情。 如果是這種情況並且您不能禁用它,那么解決方案可能涉及在外部 bash 腳本中捕獲SIGTERM並手動將其僅發送到app

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM