簡體   English   中英

懶惰/優雅地停止當前運行的 bash 腳本

[英]stop currently running bash script lazily/gracefully

假設我有一個這樣的 bash 腳本:

#!/bin/bash
exec-program zero
exec-program one

腳本向 exec-program 發出了一個運行命令,參數為“零”,對嗎? 例如,第一行當前正在運行。 我知道 Ctrl-C 將停止進程並停止執行腳本的其余部分。

相反,是否有一個按鍵可以讓當前行完成執行然后停止腳本執行(不執行“exec-program one”)(不直接修改腳本)? 在這個例子中,它會繼續運行“exec-program zero”,但之后會返回到shell而不是立即停止“exec-program zero”

TL;DR 運行時類似於“Ctrl-C”但更懶惰/優雅??

在手冊頁的 SIGNALS 部分下,它寫道:

如果 bash 正在等待命令完成並接收到設置了陷阱的信號,則在命令完成之前不會執行陷阱。

這正是你要問的。 您需要為 SIGINT 設置退出陷阱,然后在忽略 SIGINT 的子 shell 中運行exec-program 這樣它就會繼承 SIG_IGN 處理程序並且Ctrl+C不會殺死它。 下面是這個概念的一個實現。

#!/bin/bash -
trap exit INT
foo() (
  trap '' INT
  exec "$@"
)

foo sleep 5
echo alive

如果在sleep 5運行時按 Ctrl+C ,bash 將等待它完成然后退出; 你不會在終端上看到alive

exec是為了避免另一個 fork() 順便說一句。

暫無
暫無

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

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