Linux優雅退出問題

2022-04-02 03:22:54 字數 2376 閱讀 1800

先講乙個基本概念:

如何在shell中終止乙個後台程序?

kill的作用是向某個指定的程序或程序組傳送指定訊號,從而結束該程序/程序組。-s選項可以指定要傳送的具體訊號,如果沒有指定,則預設傳送sigterm(15)訊號至指定程序/程序組,若程序沒有捕獲該訊號的邏輯,則sigterm的作用是終止程序。

kill pid與kill -9 pid的區別

kill pid的作用是向程序號為pid的程序傳送sigterm(這是kill預設傳送的訊號,訊號值為15),該訊號是乙個結束程序的訊號且可以被應用程式捕獲。若應用程式沒有捕獲並響應該訊號的邏輯**,則該訊號的預設動作是kill掉程序。這是終止指定程序的推薦做法。

kill -9 pid則是向程序號為pid的程序傳送sigkill(該訊號的編號為9),從本文上面的說明可知,sigkill既不能被應用程式捕獲,也不能被阻塞或忽略,其動作是立即結束指定程序。通俗地說,應用程式根本無法「感知」sigkill訊號,它在完全無準備的情況下,就被收到sigkill訊號的作業系統給乾掉了,顯然,在這種「暴力」情況下,應用程式完全沒有釋放當前占用資源的機會。事實上,sigkill訊號是直接發給init程序的,它收到該訊號後,負責終止pid指定的程序。關於linux init程序的說明,可以參考這裡或這裡。在某些情況下(如程序已經hang死,無法響應正常訊號),就可以使用kill -9來結束程序。

若通過kill結束的程序是乙個建立過子程序的父程序,則其子程序就會成為孤兒程序(orphan process),這種情況下,子程序的退出狀態就不能再被應用程序捕獲(因為作為父程序的應用程式已經不存在了),不過應該不會對整個linux系統產生什麼不利影響。

stop() 

pid=`cat

$pid_file`

retval=$?[ -z "

$pid

" ] &&

echo

"searching process with pid: $pid

"ps -p "

$pid

" >/dev/null

2>&1

if [ $? -eq 0 ]; then

echo

"pid($pid) exist, stopping process...

"#用kill命令殺死程序********************=

kill $pid >/dev/null

2>&1

retval=$?[ $retval -eq 0 ] ||

echo

"stop exiting process success

"else

echo

"cannot find process with pid: $pid"fi

rm -f $pid_file; # remove control files

rm -f $lok_file

echo_success

return

0}

上面也已經提到了:因為springboot專案中會內嵌tomcat容器  在kill程序的時候在被程序捕獲後tomcat關閉需要一些時間,如果stop之後不休眠一定時間 有可能會導致tomcat未能正常關閉,導致第二次啟動的時候報埠衝突,第二次有pid但是程序沒有成功啟動。

所以我們在這裡調整stop之後休眠10s在啟動start

還有一種情況是:setsockopt中引數so_reuseaddr

一般來說,乙個埠釋放後會等待兩分鐘之後才能再被使用,so_reuseaddr是讓埠釋放後立即就可以被再次使用。 so_reuseaddr用於對tcp套接字處於time_wait狀態下的socket,才可以重複繫結使用。server程式總是應該在呼叫bind()之前設定so_reuseaddr套接字選項。tcp,先呼叫close()的一方會進入time_wait狀態。

我們知道,在tcp斷開鏈結的時候我們需要四次握手來斷開,而且當兩端都關閉了read/write通道以後我們還是要等待乙個time_wait時間。

這就是so_reuseaddr的作用所在.其實這個選項就是告訴os如果乙個埠處於time_wait狀態, 那麼我們就不用等待直接進入使用模式, 不需要繼續等待這個時間結束.

那這樣我們肯定要問,那為什麼我們需要有這個time_wait時間啊?

看看tcp/ip協議組我們就知道,這樣做是為了讓在網路中殘餘的tcp包消失, 也就是說, 如果我們沒有等到這個時間就讓os把這個埠釋放給其他的程序使用,別的程序很有可能就會收到上乙個會話的殘餘tcp包,這樣就會出現一系列的不可預知的錯誤.

Xcode意外退出問題

遇見過幾次xcode意外退出問題,解決方法如下 1 xcode模擬器執行僵死在 attaching to 的解決法子,是因為當時更改了網路設定的高階選項的dns 2 關機重啟 3 更改product scheme edit scheme test裡面的debugger將lldb改為none 4 網上...

bat指令碼自動退出問題

用bat寫一些指令碼時,總是會遇到cmd自動退出的問題 cmd跑到盡頭,他就自動退出了,消失了,這本來也是正常。但是,我們有時候需要看一些日誌資訊,看看跑得正不正常。他這時候直接消失了,那不是很煩躁。所以需要在cmd的最後加乙個pause,他就會暫停下來啦 有時候呼叫一些第三方bin的api或者服務...

解決ecshop後台頻繁退出問題

ecshop後台有時候會自動登出,而且還會很頻繁,頻繁的自動登出就嚴重的影響到了後台使用。修改lib base.php檔案real ip 函式,在real ip函式中新增我標註 新增 的部分 function real ip 新增 if isset cookie real ipd empty coo...