成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Linux ctrl-c explained(ctrl-c 詳解)

Me_Kun / 2938人閱讀

摘要:中斷觸發(fā)系統(tǒng)將運(yùn)行時(shí)間由用戶態(tài)程序交還給內(nèi)核態(tài)的一種方式。終端終端偽終端會(huì)話信號(hào)發(fā)送給程序的來(lái)表示有重要事件發(fā)生的軟件中斷。系統(tǒng)收到信號(hào)后,會(huì)把時(shí)間交由內(nèi)核態(tài),然后再進(jìn)行退出程序,掛起,恢復(fù),或自定義操作。

目錄

1 背景姿勢(shì)

2 前戲

3 正餐

4 systemctl stop docker

5 demo


1 背景姿勢(shì) 驅(qū)動(dòng)

驅(qū)動(dòng)程序全稱設(shè)備驅(qū)動(dòng)程序,是添加到操作系統(tǒng)中的特殊程序,其中包含有關(guān)硬件設(shè)備的信息。此信息能夠使計(jì)算機(jī)與相應(yīng)的設(shè)備進(jìn)行通信。

中斷

觸發(fā)系統(tǒng)將運(yùn)行時(shí)間由用戶態(tài)程序交還給內(nèi)核態(tài)的一種方式。

終端

終端

偽終端(pseudo terminal) --> /dev/pts/8

會(huì)話

信號(hào)

發(fā)送給程序的來(lái)表示有重要事件發(fā)生的軟件中斷。
系統(tǒng)收到信號(hào)后,會(huì)把 CPU 時(shí)間交由內(nèi)核態(tài),然后再進(jìn)行退出程序,掛起,恢復(fù),或自定義操作。

常見(jiàn)信號(hào)

信號(hào) 按鍵 意義
SIGINT Ctrl-C 退出當(dāng)前 session 所有前臺(tái)進(jìn)程
SIGTSTP Ctrl-Z 掛起前臺(tái)進(jìn)程
SIGTERM 優(yōu)雅殺掉指定進(jìn)程,可被阻塞
SIGKILL 強(qiáng)制殺掉指定進(jìn)程
Ctrl-D 不是 signal, write EOF to input
發(fā)送信號(hào)
kill -SIG pid
自定義信號(hào)
trap "echo "signal SIGINT received"" SIGINT
延伸 Tips 1:

nohup 的由來(lái):

nohup python3 manage.py runserver &

當(dāng)終端中斷時(shí)(拔網(wǎng)線,wifi 斷網(wǎng)等),相關(guān)驅(qū)動(dòng)程序會(huì)給當(dāng)前會(huì)話
(session, 簡(jiǎn)單來(lái)說(shuō)一個(gè) login shell 就是一次會(huì)話)
中所有程序(前臺(tái)和后臺(tái))發(fā)送 hang up(HUP) 信號(hào),使程序退出。

延伸 Tips 2:

Ctrl- signal SIGQUIT
Ctrl+J實(shí)際上是一個(gè)換行符。
按下Ctrl+I與按下Tab鍵的效果相同。
Ctrl+[與ESC相同。
Ctrl+H代替BackSpace鍵。
鼠標(biāo)右鍵快捷鍵:VK_APPS?(93)


2 前戲 - linux 進(jìn)程生命周期


3 正餐


4 systemctl stop docker 案發(fā)現(xiàn)場(chǎng)

耗子叔的一篇博客

systemd 是個(gè)啥么玩意

系統(tǒng)的 init 程序,進(jìn)程調(diào)度管理程序,id 為 1,所有進(jìn)程的爹

systemctl 是systemd 的 shell interface,常見(jiàn)的操作: systemctl start|stop|status|reload

systemctl stop

docker service 的行為定義在/usr/lib/systemd/system/docker.service

systemd stop 的 man: the process is terminated by sending the signal specified in KillSignal=(SIGTERM) when service stop is requested.

dockerd trap

systemctl stop dockerd 執(zhí)行后會(huì)給 dockerd 發(fā)送 SIGTERM 信號(hào),dockerd 捕獲到這個(gè)信號(hào)后,會(huì)去調(diào)用 cleanup 清理程序清理掉它下面的容器,同時(shí)計(jì)數(shù)器加一,當(dāng)收到3次 SIGTERM 或 SIGINT(比如按下 ctrl-c)后,會(huì)出發(fā) “force exit without cleanup”,強(qiáng)行退出 dockerd ,就會(huì)導(dǎo)致 dockerd 退出,但容器不退出,因而容器占用但資源(ip 地址等)不會(huì)被釋放。此外,如果 kill -9,會(huì)發(fā)送 SIGKILL,強(qiáng)行殺掉 dockerd,也是不會(huì)清除容器但。所以慎用 ctrl-c ,慎用 kill -9 ?。?!

// * If SIGINT or SIGTERM are received, `cleanup` is called, then the process is terminated.
// * If SIGINT or SIGTERM are received 3 times before cleanup is complete, then cleanup is
//   skipped and the process is terminated immediately (allows force quit of stuck daemon)
// * A SIGQUIT always causes an exit without cleanup, with a goroutine dump preceding exit.
c := make(chan os.Signal, 1)
    // we will handle INT, TERM, QUIT, SIGPIPE here
    signals := []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGPIPE}
    gosignal.Notify(c, signals...)
    go func() {
        interruptCount := uint32(0)
        for sig := range c {
            if sig == syscall.SIGPIPE {
                continue
            }

            go func(sig os.Signal) {
                logger.Info(fmt.Sprintf("Processing signal "%v"", sig))
                switch sig {
                case os.Interrupt, syscall.SIGTERM:
                    if atomic.LoadUint32(&interruptCount) < 3 {
                        // Initiate the cleanup only once
                        if atomic.AddUint32(&interruptCount, 1) == 1 {
                            // Call the provided cleanup handler
                            cleanup()
                            os.Exit(0)
                        } else {
                            return
                        }
                    } else {
                        // 3 SIGTERM/INT signals received; force exit without cleanup
                        logger.Info("Forcing docker daemon shutdown without cleanup; 3 interrupts received")
                    }
                case syscall.SIGQUIT:
                    DumpStacks("")
                    logger.Info("Forcing docker daemon shutdown without cleanup on SIGQUIT")
                }

code is here.

延伸 Tips3:

如何刪除進(jìn)程和子進(jìn)程:

進(jìn)程和子進(jìn)程在同一組中,可根據(jù) PGID kill 掉一組進(jìn)程

kill -- -$PGID   Kill using the default signal (TERM = 15)
kill -9 -$PGID   Kill using the KILL signal (9)

other methods


5 I want more

《Unix 環(huán)境高級(jí)編程》
Learn C!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27708.html

相關(guān)文章

  • docker專(zhuān)題(2):docker常用管理命令(下)

    摘要:本文承接專(zhuān)題常用管理命令上。按照指示的順序進(jìn)行即可。將同一的所有,合并為一個(gè)新的新建一個(gè),保留舊的那條記錄查看容器的信息命令可以查看容器的端口開(kāi)啟及綁定容器啟動(dòng)后執(zhí)行的。其他命令還有一些如等不是很常用的命令,比較簡(jiǎn)單,請(qǐng)參考官網(wǎng)。 本文承接docker專(zhuān)題(2):docker常用管理命令(上)。 1. 開(kāi)啟/停止/重啟container(start/stop/restart) 容器...

    duan199226 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<