shell trap命令的一些特殊注意的地方

2021-07-26 16:56:10 字數 2391 閱讀 8878

實驗1

有下面的bash**,指令碼名signal.bash。

#!/bin/bash

trap 'echo intrrupted by signal int' int

seconds0=$(date +%s)

sleep 60s

seconds1=$(date +%s)

echo "sleeped seconds : $((seconds1 - seconds0))s"

chenglin@ubuntu-chenglin:~/shellscript/other$ time ./signal.bash 

^cintrrupted by signal int

sleeped seconds : 22s

real 0m21.427s

user 0m0.000s

sys 0m0.004s

ctrl+c後能立即停止signal.bash指令碼的執行。

分析: 前台執行signal.bash指令碼,其所有子程式(外部命令)和signal.bash程式在同乙個程序組。而ctrl+c會傳送給前台程序組所有程序int訊號。signal.bash執行後會產生兩個程序,乙個是signal.bash程式本身,另外乙個是sleep程式(sleep是外部命令)。而sleep和signal.bash在同乙個前台程序組,所以ctrl+c時,sleep程式由於處於task_interruptible狀態(ps -axu可以看到其狀態是s+)。所以會被訊號int喚醒,訊號action為終止程序,自然父程序繼續執行。得出執行,直到sleep被訊號int中斷的睡眠時間。

實驗2

現在做另外乙個實驗:

開兩個終端,第乙個終端裡面執行time ./signal.bash。迅速(60s內)在第二個終端裡面執行如下:

chenglin@ubuntu-chenglin:~/shellscript/powerconsumption-net$ pgrep -f signal.bash -l

25700 signal.bash

chenglin@ubuntu-chenglin:~/shellscript/powerconsumption-net$ kill -int 25700

發現第乙個終端中列印如下:

chenglin@ubuntu-chenglin:~/shellscript/other$ time ./signal.bash 

intrrupted by signal int

sleeped seconds : 60s

real 1m0.013s

user 0m0.004s

sys 0m0.004s

第二個終端不能立即停止第乙個終端中signal.bash的執行。

分析: 在第二個終端是,訊號int是指定傳送給signal.bash的,而不是sleep的,所以sleep沒有接收到int訊號,而繼續睡眠,直到指定的時間60s後,當60s後,sleep返回。主程式signal.bash此時才會處理訊號。列印intrrupted by signal int,說明處理了訊號int。

實驗3

現在做第三個實驗:

開兩個終端,第乙個終端裡面執行time ./signal.bash。迅速(60s內)在第二個終端裡面執行如下:

chenglin@ubuntu-chenglin:~/shellscript/powerconsumption-net$ pgrep -f sleep -l

25708 sleep

chenglin@ubuntu-chenglin:~/shellscript/powerconsumption-net$ kill -int 25708

chenglin@ubuntu-chenglin:~/shellscript/powerconsumption-net$

發現第乙個終端列印如下:

chenglin@ubuntu-chenglin:~/shellscript/other$ time ./signal.bash 

sleeped seconds : 16s

real 0m15.915s

user 0m0.000s

sys 0m0.008s

分析:和實驗2不同,這裡是直接對sleep傳送int訊號,可以直接喚醒sleep程序,並終止。但是注意到signal.bash並沒有列印intrrupted by signal int,因為訊號是發給sleep程序,而不是signal.bash程序的。所以sgnal.bash程序無需處理int訊號。

git命令的一些命令

1 git是一款開源的分布式版本控制工具 工作區 working directory 倉庫資料夾裡除.git目錄以外的內容 版本庫 reository git目錄,用於儲存記錄版本資訊 暫緩區 stage 分支 master git自動建立的第乙個分支 head指標 用於指向當前分支 git add...

oracle的一些命令

create tablespace datafile data 00.dbf size 500m create user identified by passwd default tablespace tbs temporary tablespace temp create table id int...

mysql的一些命令

windows使用者 要這麼載入多條資料 mysql load data local infile path pet.txt into table pet lines terminated by r n txt檔案寫法 空值的用 n代替,每個值之間用tab隔開 fluffy harold cat f...