最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux kill正在執(zhí)行的后臺(tái)任務(wù) kill進(jìn)程組使用詳解

 更新時(shí)間:2025年11月11日 11:34:30   作者:fengyehongWorld  
文章介紹了兩個(gè)腳本的功能和區(qū)別,以及執(zhí)行這些腳本時(shí)遇到的進(jìn)程管理問題,通過查看進(jìn)程樹、使用`kill`命令和`lsof`命令,分析了子進(jìn)程的生命周期和父子關(guān)系,最后,提出了使用進(jìn)程組ID(PGID)來殺死所有相關(guān)子進(jìn)程的解決方案,并總結(jié)了`kill`命令的不同信號(hào)類型及其行為

零. 用到的命令

# 查看當(dāng)前session會(huì)話正在后臺(tái)執(zhí)行的job
jobs -l
# 查看當(dāng)前腳本的進(jìn)程信息
ps -ef | grep -a "[m]y_script_child_process.sh"
ps -o pid,pgid,ppid,cmd --forest
# 以樹狀圖的形式表示指定的進(jìn)程號(hào)
pstree -p 659
# 殺死659的進(jìn)程號(hào)
kill -TERM 659
# 殺死659的進(jìn)程組
kill -TERM -659
# 查看bigfile.csv被哪個(gè)進(jìn)程占用
lsof bigfile.csv
# 用setsid啟動(dòng)新會(huì)話,確保子進(jìn)程和父進(jìn)程用同一個(gè)進(jìn)程組
setsid nohup bash my_script_child_process.sh > /dev/null 2>&1 &

一. 待執(zhí)行的腳本

有如下2個(gè)腳本

apluser@FengYeHong-HP:0727$ ls -l
-rw-r--r-- 1 apluser apluser 194 Jul 27 11:01 my_script_child_process.sh
-rw-r--r-- 1 apluser apluser 180 Jul 27 11:42 my_script_no_child_process.sh

兩個(gè)腳本的作用相同,都是要花時(shí)間生成一個(gè)csv文件之后,然后睡眠10秒,然后打印內(nèi)容到控制臺(tái)

  • my_script_child_process.sh:在腳本中使用了(),在腳本啟動(dòng)時(shí),會(huì)創(chuàng)建一個(gè)子進(jìn)程
  • my_script_no_child_process.sh:沒有使用(),在腳本啟動(dòng)時(shí),不會(huì)創(chuàng)建一個(gè)子進(jìn)程
apluser@FengYeHong-HP:0727$ cat my_script_child_process.sh
(
  echo "No,姓名,auid,地址"
  seq 1 40000000 | awk 'BEGIN{OFS=","} {
      printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1
  }'
) > bigfile.csv
sleep 10
echo "執(zhí)行完成"
apluser@FengYeHong-HP:0727$ cat my_script_no_child_process.sh
echo "No,姓名,auid,地址"
seq 1 40000000 | awk 'BEGIN{OFS=","} {
  printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1
}' > bigfile.csv
sleep 10
echo "執(zhí)行完成"

二. 執(zhí)行含子進(jìn)程的腳本,并kill

2.1 進(jìn)程查看

通過&的方式在后臺(tái)執(zhí)行腳本,并使用jobs -l查看正在執(zhí)行的job的狀態(tài)

  • 可以看到該腳本目前處于Running的狀態(tài)
  • 腳本對(duì)應(yīng)的進(jìn)程號(hào)為:659
apluser@FengYeHong-HP:0727$ bash my_script_child_process.sh &
[1] 659
apluser@FengYeHong-HP:0727$ jobs -l
[1]+   659 Running                 bash my_script_child_process.sh &

通過ps -ef的方式查看腳本的進(jìn)程,因?yàn)槭褂?code>()在腳本內(nèi)部開啟了子進(jìn)程,所以我們會(huì)發(fā)現(xiàn)有2個(gè)關(guān)聯(lián)進(jìn)程

apluser@FengYeHong-HP:0727$ ps -ef | grep -a "[m]y_script_child_process.sh"
# UID(用戶)  PID(進(jìn)程 ID) PPID(父進(jìn)程 ID) CPU 占用率  啟動(dòng)時(shí)間  TTY(終端) 占用 CPU 時(shí)間  啟動(dòng)的命令
apluser       659            517              0          15:18     pts/0      00:00:00      bash my_script_child_process.sh
apluser       660            659              0          15:18     pts/0      00:00:00      bash my_script_child_process.sh

查看進(jìn)程的父子層級(jí)關(guān)系(樹狀結(jié)構(gòu))以及每個(gè)進(jìn)程的 ID 信息

  • pid:進(jìn)程 ID
  • pgid:進(jìn)程組 ID
  • ppid:父進(jìn)程 ID
  • cmd:?jiǎn)?dòng)命令
  • --forest:以 樹狀結(jié)構(gòu) 顯示進(jìn)程的父子層級(jí)關(guān)系
apluser@FengYeHong-HP:0727$ ps -o pid,pgid,ppid,cmd --forest
  PID  PGID  PPID CMD
  517   517   516 -bash
  659   659   517  \_ bash my_script_child_process.sh
  660   659   659  |   \_ bash my_script_child_process.sh
  661   659   660  |       \_ seq 1 40000000
  662   659   660  |       \_ awk BEGIN{OFS=","} {       printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1   }
  665   665   517  \_ ps -o pid,pgid,ppid,cmd --forest

圖形化地查看進(jìn)程樹(659是主進(jìn)程)

659的主進(jìn)程中,創(chuàng)建了660的子進(jìn)程

通過()創(chuàng)建的660的子進(jìn)程內(nèi)部

  • 又通過awk和seq命令分別創(chuàng)建了661662的進(jìn)程
  • 這些子進(jìn)程和主進(jìn)程都屬于PGID659的進(jìn)程組
apluser@FengYeHong-HP:0727$ pstree -p 659
bash(659)───bash(660)─┬─awk(662)
                      └─seq(661)

2.2 遇到的問題

在我們執(zhí)行kill命令之前,生成的文件大小如下

apluser@FengYeHong-HP:0727$ ls -l bigfile.csv
-rw-r--r-- 1 apluser apluser 732053526 Jul 27 15:19 bigfile.csv

通過kill命令殺死PID為659的主進(jìn)程

apluser@FengYeHong-HP:0727$ kill -TERM 659
apluser@FengYeHong-HP:0727$
[1]+  Terminated              bash my_script_child_process.sh

kill命令執(zhí)行之后,再次觀察文件,發(fā)現(xiàn)文件并沒有停止增長(zhǎng),反而繼續(xù)增大

apluser@FengYeHong-HP:0727$ ls -l bigfile.csv
-rw-r--r-- 1 apluser apluser 960819222 Jul 27 15:19 bigfile.csv

此時(shí)通過lsof命令查看bigfile.csv文件被哪些進(jìn)程所占用,得到如下結(jié)果

  • 可以看到主線程被kill掉之后,子線程依然活躍,所以文件 bigfile.csv 仍然在持續(xù)寫入
  • 在主線程被kill掉之后,awk 的進(jìn)程(例如 PID 662)已經(jīng)獨(dú)立運(yùn)行,此時(shí)的進(jìn)程被稱為孤兒進(jìn)程
  • 除非我們顯式地kill掉,否則孤兒進(jìn)程會(huì)一直執(zhí)行到結(jié)束
apluser@FengYeHong-HP:0727$ lsof bigfile.csv
COMMAND PID    USER       FD   TYPE  DEVICE   SIZE/OFF    NODE    NAME
bash    660    apluser    1w   REG   8,48     1222258710  42569   bigfile.csv
awk     662    apluser    1w   REG   8,48     1222266902  42569   bigfile.csv

2.3 解決

2.3.1 kill進(jìn)程的時(shí)候,kill進(jìn)程組

我們?cè)凇?.1 進(jìn)程查看】的時(shí)候,查看過腳本相關(guān)的進(jìn)程的詳細(xì)信息

apluser@FengYeHong-HP:0727$ ps -o pid,pgid,ppid,cmd --forest
  PID  PGID  PPID CMD
  517   517   516 -bash
  659   659   517  \_ bash my_script_child_process.sh
  660   659   659  |   \_ bash my_script_child_process.sh
  661   659   660  |       \_ seq 1 40000000
  662   659   660  |       \_ awk BEGIN{OFS=","} {       printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1   }
  665   665   517  \_ ps -o pid,pgid,ppid,cmd --forest

下面的這行命令,kill的是PID為659的主進(jìn)程,并不會(huì)對(duì)子進(jìn)程產(chǎn)生影響

kill -TERM 659

要想同時(shí)殺死主進(jìn)程的關(guān)聯(lián)子進(jìn)程,kill的對(duì)象不是PID,而應(yīng)該是PGID,即進(jìn)程組,只要所有的子進(jìn)程和主進(jìn)程同屬于一個(gè)進(jìn)程組,kill掉進(jìn)程組就可殺死主進(jìn)程的關(guān)聯(lián)子進(jìn)程。

# ??注意,使用【-】來指定kill的是進(jìn)程組??
kill -TERM -659

2.3.2 不使用() 或者 使用{}

不使用()

apluser@FengYeHong-HP:0727$ cat my_script_no_child_process.sh
echo "No,姓名,auid,地址"
seq 1 40000000 | awk 'BEGIN{OFS=","} {
  printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1
}' > bigfile.csv
sleep 10
echo "執(zhí)行完成"
apluser@FengYeHong-HP:0727$ bash my_script_no_child_process.sh &
[1] 687
  • 可以看到,只有一個(gè)線程存在
apluser@FengYeHong-HP:0727$ ps -ef | grep -a "[m]y_script_no_child_process.sh"
apluser    687   517  0 16:21 pts/0    00:00:00 bash my_script_no_child_process.sh

使用{}

apluser@FengYeHong-HP:0727$ cat my_script_no_child_process.sh
{
    echo "No,姓名,auid,地址";
    seq 1 40000000 | awk 'BEGIN{OFS=","} {
        printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1
    }'
} > bigfile.csv
sleep 10
echo "執(zhí)行完成"
apluser@FengYeHong-HP:0727$ bash my_script_no_child_process.sh &
[1] 702
  • 可以看到,只有一個(gè)線程存在
apluser@FengYeHong-HP:0727$ ps -ef | grep -a "[m]y_script_no_child_process.sh"
apluser    702   517  0 16:33 pts/0    00:00:00 bash my_script_no_child_process.sh

2.3.3 使用setsid啟動(dòng)新會(huì)話

通過bash my_script_child_process.sh &啟動(dòng)的腳本,其中的子進(jìn)程和父進(jìn)程有可能不在同一個(gè)進(jìn)程組里面,可通過setsid解決該問題。

setsid 的作用:

  • 啟動(dòng)一個(gè)新進(jìn)程,并創(chuàng)建新的會(huì)話(SID)和新的進(jìn)程組(PGID),新進(jìn)程成為這個(gè)會(huì)話的首進(jìn)程(session leader)。
  • 然后這個(gè)新進(jìn)程(比如 PID 776)執(zhí)行 bash my_script_child_process.sh,這就成為了腳本的頂層的bash進(jìn)程。
  • 所有其fork 出來的子進(jìn)程(包括 seq、awk 等),默認(rèn)都會(huì)繼承這個(gè) PGID 和 SID,除非子進(jìn)程中自己調(diào)用了 setsid 或 setpgid 修改了所屬組/會(huì)話。

啟動(dòng)腳本

  • 注意:?jiǎn)?dòng)腳本時(shí)出現(xiàn)的808進(jìn)程號(hào)是setsid命令本身的進(jìn)程號(hào)
  • 808進(jìn)程號(hào)并不是my_script_child_process.sh腳本的進(jìn)程號(hào)
apluser@FengYeHong-HP:0727$ cat my_script_child_process.sh
(
  echo "No,姓名,auid,地址"
  seq 1 40000000 | awk 'BEGIN{OFS=","} {
      printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1
  }'
) > bigfile.csv
sleep 10
echo "執(zhí)行完成"
apluser@FengYeHong-HP:0727$ setsid nohup bash my_script_child_process.sh > /dev/null 2>&1 &
[1] 808
apluser@FengYeHong-HP:0727$
[1]+  Done                  setsid nohup bash my_script_child_process.sh > /dev/null 2>&1
apluser@FengYeHong-HP:0727$

查看my_script_child_process.sh腳本的進(jìn)程號(hào)

apluser@FengYeHong-HP:0727$ ps -ef | grep -a "[m]y_script_child_process.sh"
apluser    809   516  0 17:03 ?        00:00:00 bash my_script_child_process.sh
apluser    810   809  0 17:03 ?        00:00:00 bash my_script_child_process.sh

kill腳本進(jìn)程組前后的文件變化

# kill之前查看問價(jià)大小
apluser@FengYeHong-HP:0727$ ls -l bigfile.csv
-rw-r--r-- 1 apluser apluser 352866326 Jul 27 17:03 bigfile.csv
# kill進(jìn)程組
apluser@FengYeHong-HP:0727$ kill -TERM -809
# kill之后查看文件大小,沒有再發(fā)生變化
apluser@FengYeHong-HP:0727$ ls -l
-rw-r--r-- 1 apluser apluser 692047894 Jul 27 17:03 bigfile.csv
apluser@FengYeHong-HP:0727$ ls -l
-rw-r--r-- 1 apluser apluser 692047894 Jul 27 17:03 bigfile.csv

三. kill的相關(guān)知識(shí)

3.1kill -TERM -113和kill -TERM 113的不同之處

  • kill -TERM 113

只對(duì) 一個(gè)進(jìn)程(PID = 113)發(fā)出終止信號(hào)。

它不會(huì)影響這個(gè)進(jìn)程的任何子進(jìn)程,除非你手動(dòng)對(duì)每個(gè)子進(jìn)程都發(fā)送信號(hào)。

這是最常用、最基本的 kill 形式。

  • kill -TERM -113

前面帶了 -,表示你要?dú)⒌氖?進(jìn)程組(process group)。

所以這個(gè)命令會(huì)向 進(jìn)程組 ID 為 113 的所有進(jìn)程(包括前臺(tái)/后臺(tái)作業(yè)中的多個(gè)子進(jìn)程)發(fā)送 SIGTERM。

命令意思
kill -TERM 113向 PID 為 113 的單個(gè)進(jìn)程發(fā)送 SIGTERM
kill -TERM -113向 進(jìn)程組 ID 為 113 的整個(gè)進(jìn)程組發(fā)送 SIGTERM

3.2kill -TERM -113和kill -9 -113的區(qū)別

  • kill -TERM -113:給整個(gè)進(jìn)程組發(fā)送終止請(qǐng)求(溫和)

這樣可以讓進(jìn)程有機(jī)會(huì)做清理工作(比如關(guān)閉文件、釋放資源)

kill -9 -113:給整個(gè)進(jìn)程組發(fā)送立即終止(粗暴),發(fā)出的是 SIGKILL,無法被捕獲或忽略,進(jìn)程會(huì)被直接殺死,可能導(dǎo)致:

  • 文件寫到一半
  • 臨時(shí)資源未釋放
  • 數(shù)據(jù)庫(kù)等狀態(tài)不一致
命令信號(hào)類型行為可被攔截或清理?
kill -TERM -113SIGTERM (15)請(qǐng)求正常終止整個(gè)進(jìn)程組? 是的
kill -9 -113SIGKILL (9)強(qiáng)制立即終止整個(gè)進(jìn)程組? 否

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vim自定義高亮分組以及一些實(shí)用技巧小結(jié)

    Vim自定義高亮分組以及一些實(shí)用技巧小結(jié)

    Vim/Vi基本上是*nix世界最受歡迎的編輯器了,不知道為什么,一直以來覺得和Emacs比起來,Vim更加有親和力,用起來很舒服。那么下面這篇文章主要給大家介紹了關(guān)于Vim自定義高亮分組以及一些實(shí)用技巧的相關(guān)資料,需要的朋友可以參考下。
    2017-07-07
  • Linux限制su的幾種常用方法小結(jié)

    Linux限制su的幾種常用方法小結(jié)

    在Linux系統(tǒng)中,su命令允許用戶以另一個(gè)用戶(通常是root)的身份運(yùn)行命令或切換用戶環(huán)境,盡管su提供了便利,但在安全性敏感的環(huán)境中,允許任意用戶通過su切換到root或其他特權(quán)用戶可能會(huì)帶來嚴(yán)重的安全風(fēng)險(xiǎn),本文將深入探討幾種常見的限制su的方法,需要的朋友可以參考下
    2025-09-09
  • Linux的netstat命令詳解

    Linux的netstat命令詳解

    這篇文章主要介紹了Linux的netstat命令,netstat命令用于顯示與IP、TCP、UDP和ICMP協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù),它能提供TCP連接,TCP和UDP監(jiān)聽,進(jìn)程內(nèi)存管理的相關(guān)報(bào)告。需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • 在Linux系統(tǒng)上創(chuàng)建軟連接和硬連接的方法

    在Linux系統(tǒng)上創(chuàng)建軟連接和硬連接的方法

    這篇文章主要介紹了在Linux系統(tǒng)上創(chuàng)建軟連接和硬連接的方法,通過執(zhí)行 man ln 命令,可以看到這是在文件之間建立鏈接,而沒有提及是軟鏈接或硬鏈接,文中通過代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 在CentOS7系統(tǒng)上編譯安裝MySQL 5.7.13步驟詳解

    在CentOS7系統(tǒng)上編譯安裝MySQL 5.7.13步驟詳解

    本篇文章主要介紹了在CentOS7系統(tǒng)上編譯安裝MySQL 5.7.13步驟詳解,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Linux下環(huán)境變量配置方法小結(jié)(.bash_profile和.bashrc的區(qū)別)

    Linux下環(huán)境變量配置方法小結(jié)(.bash_profile和.bashrc的區(qū)別)

    這篇文章主要介紹了Linux下環(huán)境變量配置方法小結(jié)(.bash_profile和.bashrc的區(qū)別),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • linux用cat查看二進(jìn)制文件出現(xiàn)亂碼的解決方案

    linux用cat查看二進(jìn)制文件出現(xiàn)亂碼的解決方案

    這篇文章主要介紹了linux用cat查看二進(jìn)制文件出現(xiàn)亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • LAMP服務(wù)器性能優(yōu)化技巧之Apache服務(wù)器優(yōu)化

    LAMP服務(wù)器性能優(yōu)化技巧之Apache服務(wù)器優(yōu)化

    目前LAMP (Linux + Apache + MySQL + PHP) 近幾年來發(fā)展迅速,已經(jīng)成為Web 服務(wù)器的事實(shí)標(biāo)準(zhǔn)。本文我們將介紹基于LAMP組合的服務(wù)器的性能優(yōu)化技巧
    2012-02-02
  • CentOS?7安裝TigerVNC?Server的流程

    CentOS?7安裝TigerVNC?Server的流程

    本文指導(dǎo)在CentOS7上安裝TigerVNCServer,包括使用非root用戶、配置systemd服務(wù)、設(shè)置分辨率、開放防火墻端口及創(chuàng)建密碼,以實(shí)現(xiàn)遠(yuǎn)程訪問并支持多用戶配置
    2025-10-10
  • Linux之配置路由轉(zhuǎn)發(fā)功能的測(cè)試

    Linux之配置路由轉(zhuǎn)發(fā)功能的測(cè)試

    這篇文章主要介紹了Linux之配置路由轉(zhuǎn)發(fā)功能的測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

云林县| 西乌| 洪雅县| 安阳县| 宁陕县| 固原市| 乌兰察布市| 巫山县| 河津市| 楚雄市| 潜山县| 腾冲县| 渭源县| 山阳县| 肃北| 吉首市| 凉城县| 泰和县| 乐都县| 秭归县| 望都县| 镇沅| 三河市| 涿州市| 河南省| 曲周县| 奇台县| 海伦市| 嵊泗县| 大邑县| 瑞丽市| 苍溪县| 和静县| 洪雅县| 黄陵县| 密云县| 青河县| 丹阳市| 丰原市| 长寿区| 定兴县|