日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

docker 中進(jìn)程的信號(hào)

作者:吉松松 更新時(shí)間: 2022-07-09 編程語言

容器中的應(yīng)用優(yōu)雅的退出

一、進(jìn)程的退出 - Linux

1、kill 參數(shù)
1 SIGHUP 啟動(dòng)被終止的程序,可讓該進(jìn)程重新讀取自己的配置文件,類似重新啟動(dòng)。
2 SIGINT 相當(dāng)于用鍵盤輸入 [ctrl]-c 來中斷一個(gè)程序的進(jìn)行。
9 SIGKILL 代表強(qiáng)制中斷一個(gè)程序的進(jìn)行,如果該程序進(jìn)行到一半,那么尚未完成的部分可能會(huì)有“半產(chǎn)品”產(chǎn)生,類似 vim會(huì)有 .filename.swp 保留下來。
15 SIGTERM 以正常的方式來終止該程序。由于是正常的終止,所以后續(xù)的動(dòng)作會(huì)將他完成。不過,如果該程序已經(jīng)發(fā)生問題,就是無法使用正常的方法終止時(shí),輸入這個(gè) signal 也是沒有用的。
19 SIGSTOP 相當(dāng)于用鍵盤輸入 [ctrl]-z 來暫停一個(gè)程序的進(jìn)行。
2、信號(hào)

信號(hào)是一種進(jìn)程間通信的形式。一個(gè)信號(hào)就是內(nèi)核發(fā)送給進(jìn)程的一個(gè)消息,告訴進(jìn)程發(fā)生了某種事件。當(dāng)一個(gè)信號(hào)被發(fā)送給一個(gè)進(jìn)程后,進(jìn)程會(huì)立即中斷當(dāng)前的執(zhí)行流并開始執(zhí)行信號(hào)的處理程序。如果沒有為這個(gè)信號(hào)指定處理程序,就執(zhí)行默認(rèn)的處理程序。
進(jìn)程需要為自己感興趣的信號(hào)注冊(cè)處理程序,比如為了能讓程序優(yōu)雅的退出(接到退出的請(qǐng)求后能夠?qū)Y源進(jìn)行清理)一般程序都會(huì)處理 SIGTERM 信號(hào)。與 SIGTERM 信號(hào)不同,SIGKILL 信號(hào)會(huì)粗暴的結(jié)束一個(gè)進(jìn)程。因此我們的應(yīng)用應(yīng)該實(shí)現(xiàn)這樣的目錄:捕獲并處理 SIGTERM 信號(hào),從而優(yōu)雅的退出程序。如果我們失敗了,用戶就只能通過 SIGKILL 信號(hào)這一終極手段了。除了 SIGTERM 和 SIGKILL ,還有像 SIGUSR1 這樣的專門支持用戶自定義行為的信號(hào)

二、容器中的信號(hào)

  1. 容器的 1 號(hào)進(jìn)程為Dockerfile文件中啟動(dòng)命令進(jìn)程。

  2. 只有容器中的 1 號(hào)進(jìn)程能夠收到信號(hào)。

  3. 如果需要使用容器動(dòng)態(tài)化(即CMD命令為腳本啟動(dòng)),那么腳本進(jìn)程就為1號(hào)進(jìn)程 。

    例如:/bin/bash /root/start.sh為1號(hào)進(jìn)程,應(yīng)用進(jìn)程為其他級(jí)別。

  4. 如果既想容器動(dòng)態(tài)化,又想優(yōu)雅退出。那么可以由DockerDameon發(fā)送信號(hào)給1號(hào)進(jìn)程,再有1號(hào)進(jìn)程發(fā)送給應(yīng)用進(jìn)程,實(shí)現(xiàn)信號(hào)的傳遞。腳本如下:

#!/bin/bash

pid=0

term_handler() {
  if [ $pid -ne 0 ]; then
    kill -SIGTERM "$pid"
    wait "$pid"
  fi
  exit 143;
}

trap 'kill ${!}; term_handler' SIGTERM

啟動(dòng)命令 &
pid="$!"

while true
do
  tail -f /dev/null & wait ${!}
done

原文鏈接:https://blog.csdn.net/m0_37642477/article/details/125668625

欄目分類
最近更新