2017-01-18 18 views
0

當我有這個簡單的bash腳本不響應:我的bash腳本的信號打開新的shell會話

#!/bin/bash 
trap "rm /testfile; service apache2 stop;" SIGTERM 
service apache2 start 
# Here I want to create new bash session for some reasons. 
/bin/bash 

現在一些其他程序可以somewhen發送SIGTERM這個腳本,但實際上腳本不會迴應這個信號,它會一直掛在新的bash會話上,當我使用sleep infinity之類的其他東西而不是打開新的bash會話時(這只是爲了測試,因爲我需要bash會話)。

如何讓此腳本對該SIGTERM做出響應?新bash會話如何終止並不重要,我只想確保我在trap中寫的內容將被執行。

+0

正如@Fred所說。你本質上是在'trap'rm/testfile; service apache2 stop'之前執行'service apache2 start'; SIGTERM'被稱爲。你可能想在'trap'中包含'start'。可能最好讓'trap'調用一個同時執行'stop'('rm')和'start'的助手腳本。 (你的第二個'/ bin/bash'沒有幫助) –

+0

你想達到什麼目的?爲什麼其他進程不會簡單地停止Apache而不是發出這個腳本的信號來讓這個腳本停止Apache? – Fred

+0

檢查了這個 - http://unix.stackexchange.com/questions/146756/forward-sigterm-to-child-in-bash –

回答

1

直到定義它的shell獲得控制權後纔會調用陷阱。既然你啓動bash,並且這個新進程需要控制,那麼陷阱永遠不會被調用。

+0

難道我不知道如何讓我的shell腳本在接收到某些信號時殺死子bash會話? –

+0

如果「sub-bash」在前臺,我認爲你不能。但是你的腳本並沒有試圖做到這一點,它試圖殺死Apache。如果你想殺死「子打擊者」,你爲什麼不告訴自己的過程,而不是試圖向父母發出信號?作爲參考,如果一個進程在後臺有子進程,它將在下一個執行的命令結束後收到信號(包括如果它被等待其他進程完成的「等待」語句阻塞),然後可以終止子進程。如果我明白你想要達到的目標,也許我可以提出一些建議。 – Fred

+0

如果你知道Docker,我開始啓動一些服務的Docker容器,然後我更喜歡啓動bash會話,而不是阻止我的入口點如何(例如尾部),所以bash更有意義,但在這種情況下,在發出docker stop命令時,docker容器將無法正常退出,並且我的服務將被終止,而不是正常關閉。所以我必須將SIGTERM發送給父bash,因爲我使用的是docker stop,它只處理父bash。如果這是不可能的,所以我會忘記這一點,而不是用Bash啓動我的Docker容器:),謝謝! –