ssh 關閉後仍保持當前執行的程序
由於各種原因,需要通過ssh登入linux或者unix主機,很多時候我們需要通過ssh的終端啟動一些服務或者執行一些程式,但是預設情況下,當我們關閉ssh終端連線,隨之啟動的程式也會關閉。原因是:ssh會話關閉時,ssh所關聯的pty關閉,系統會給這個pty所關聯的session中的所有程序傳送sighup訊號,sighup的預設訊號處理程式是終止程序,除非程序自己處理了 sighup。
解決方法如下:
使用現成的命令nohup,可以讓指定的程式在pty關閉之後繼續執行。
執行方法:
#nohupprogram &
現在就可以正常關閉ssh了,你會發現你的服務依然存在執行
症狀:使用securecrt工具ssh遠端連線linux,不退出ssh,而是強行關閉終端(合上筆記本走人)情況下,後台啟動的應用也會關閉。
後果:男人哭吧哭吧不是罪!
測試案例:
很明顯的是關閉終端後,前台執行的程式會被隨之關閉,但是後台程序也會因為終端異常關閉而關掉,如下是乙個簡單的測試結果:
1、後台執行程式,正常關閉ssh連線,關閉終端的情況:
開啟兩個終端,其中第乙個在後台執行ping操作
ping google.com | tee log.txt &
在第二個終端觀察
tail -f log.txt 可以看到日誌一直在寫
使用pstree命令可以看到ping的程序存在
|-sshd-+-sshd---sshd---bash---pstree
| `-sshd---sshd---bash-+-ping
| `-tee
ctrl+d 退出第乙個終端 然後關閉終端
第二個終端的日誌仍然在寫,pstree命令:
|-ping
ps x
29427 ? s 0:00 ping google.com
看到ping的程序依然存在
2、後台執行程式,非正常關閉ssh連線(模擬突然掉電或者,未來得及退出ssh,或者ssh仍然連線,直接關閉終端securecrt)情況:
同樣開啟兩個終端,其中第乙個在後台執行ping操作
ping google.com | tee log.txt &
在第二個終端觀察
tail -f log.txt 可以看到日誌一直在寫
使用pstree命令可以看到ping的程序存在
|-sshd-+-sshd---sshd---bash---pstree
| `-sshd---sshd---bash-+-ping
| `-tee
在不退出ssh的情況下,強行關閉第乙個終端(securecrt)
在第二個終端觀察
tail -f log.txt 可以看到日誌已經停止寫。
使用pstree命令可以看到ping的程序被停掉
ps aux看不到ping的程序,說明強行關閉終端的情況下後台程序也別kill掉了
查了一下資料,這其中起關鍵的是 sighup訊號
檢視所有的訊號:
kill -l
1) sighup 2) sigint 3) sigquit 4) sigill
5) sigtrap 6) sigabrt 7) sigbus 8) sigfpe
9) sigkill 10) sigusr1 11) sigsegv 12) sigusr2
13) sigpipe 14) sigalrm 15) sigterm 17) sigchld
18) sigcont 19) sigstop 20) sigtstp 21) sigttin
22) sigttou 23) sigurg 24) sigxcpu 25) sigxfsz
26) sigvtalrm 27) sigprof 28) sigwinch 29) sigio
30) sigpwr 31) sigsys 34) sigrtmin 35) sigrtmin+1
36) sigrtmin+2 37) sigrtmin+3 38) sigrtmin+4 39) sigrtmin+5
40) sigrtmin+6 41) sigrtmin+7 42) sigrtmin+8 43) sigrtmin+9
44) sigrtmin+10 45) sigrtmin+11 46) sigrtmin+12 47) sigrtmin+13
48) sigrtmin+14 49) sigrtmin+15 50) sigrtmax-14 51) sigrtmax-13
52) sigrtmax-12 53) sigrtmax-11 54) sigrtmax-10 55) sigrtmax-9
56) sigrtmax-8 57) sigrtmax-7 58) sigrtmax-6 59) sigrtmax-5
60) sigrtmax-4 61) sigrtmax-3 62) sigrtmax-2 63) sigrtmax-1
64) sigrtmax
列表中,編號為1 ~ 31的訊號為傳統unix支援的訊號,是不可靠訊號(非實時的),編號為32 ~ 63的訊號是後來擴充的,稱做可靠訊號(實時訊號)。不可靠訊號和可靠訊號的區別在於前者不支援排隊,可能會造成訊號丟失,而後者不會。
sighup訊號在使用者終端連線(正常或非正常)結束時發出, 通常是在終端的控制程序結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。
登入linux時,系統會分配給登入使用者乙個終端(session)。在這個終端執行的所有程式,包括前台程序組和後台程序組,一般都屬於這個 session。
當使用者退出linux登入時,前台程序組和後台有對終端輸出的程序將會收到sighup訊號。這個訊號的預設操作為終止程序,因此前台程序組和後台有終端輸出的程序就會中止。
不過有的程式可以捕獲這個訊號,並忽略它,這樣就算退出了linux登入,後台程式依舊執行。
此外,對於與終端脫離關係的守護程序,這個訊號用於通知它重新讀取配置檔案。
以下是網路的相關資料
—— securecrt異常退出和執行exit的區別?
如果直接關閉securecrt(此處假設是使用ssh登入終端的),那麼對於被登入的系統來說,就是遠端程式異常斷連。和我們突然斷網掉線是一樣的效果。
這種情況下,使用者並沒有訊號傳送,而是sshd服務檢測到對端響應超時,然後向之前建立起的連線以及該連線下(ssh登入後會分配乙個bash給使用者)的程序傳送結束訊號。如果部分程序忽略sshd傳送的訊號,程序不退出,在分配給使用者的bash退出後,該程序將被init程序接管。
終端異常退出後,後台程序不關閉的解決辦法:
1、使用nohup命令: nohup [argument…] & nohup可以遮蔽sighup訊號!
2、使用 screen命令。
簡單介紹如下:
screen vi /tmp/2hei.net
需要中斷連線:
screen ctrl+a d
查詢screen程序:
ps x
20377 ? ss 0:00 screen vi /tmp/2hei.net
重連 screen -r 20377
參考資料:
AIX 啟動與關閉
系統啟動過程 系統啟動的模式 1 normal模式 a.多使用者模式 b.啟動服務與程序 c.正常對外服務狀態 2 sms模式 a.沒有啟動aix系統 b.從firmware啟動 c.做硬體維護 3 maintenance模式 a.單使用者模式 b.沒有對外服務 c.做系統維護 4 diagnost...
推送關閉與開啟
registerforremotenotificationtypes is not supported in ios 8.0 and later ios8 push解決方法 昨天晚上整理push的東西,準備些乙個教程,全部弄好之後,發現沒有達到預期的效果,本以為是伺服器 的問題 因為本人對php 一...
Oracle啟動與關閉
要想啟動或關閉oracle系統,必須首先切換到oracle使用者 su oracleoracle svrmgrl svrmgr connect internal svrmgr startup svrmgr quitoracle svrmgrl svrmgr connect internal svrm...