導航:首頁 > 操作系統 > linuxshell腳本進程

linuxshell腳本進程

發布時間:2022-11-19 22:45:24

Ⅰ 如何運行linux shell程序

如何運行shell程序,如何在shell程序以及後續腳本中使用同一個變數,這些在工作中經常用到, 我找到如下的文章,再加深復習一下。
1 source命令用法:
source FileName
作用:在當前bash環境下讀取並執行FileName中的命令。該filename文件可以無"執行許可權"
註:該命令通常用命令「.」來替代。
如:source .bash_profile
. .bash_profile兩者等效。
source(或點)命令通常用於重新執行剛修改的初始化文檔。
source命令(從 C Shell 而來)是bash shell的內置命令。
點命令,就是個點符號,(從Bourne Shell而來)。
source的程序主體是bash,腳本中的$0變數的值是bash,而且由於作用於當前bash環境,腳本中set的變數將直接起效

2 sh, bash的命令用法:
sh/bash FileName

作用:打開一個子shell來讀取並執行FileName中命令。該filename文件可以無"執行許可權"

註:運行一個shell腳本時會啟動另一個命令解釋器.
每個shell腳本有效地運行在父shell(parent shell)的一個子進程里.
這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程.
shell腳本也可以啟動他自已的子進程.
這些子shell(即子進程)使腳本並行地,有效率地地同時運行腳本內的多個子任務.
在ubuntu中sh只是bash的一個鏈接。
由於是在子shell中執行,腳本設置的變數不會影響當前shell。

3 ./的命令用法:
./FileName
作用:打開一個子shell來讀取並執行FileName中命令。該filename文件需要"執行許可權"
註:運行一個shell腳本時會啟動另一個命令解釋器.
每個shell腳本有效地運行在父shell(parent shell)的一個子進程里.
這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程.
shell腳本也可以啟動他自已的子進程.
這些子shell(即子進程)使腳本並行地,有效率地地同時運行腳本內的多個子任務.
由於是在子shell中執行,腳本設置的變數不會影響當前shell。

4 export:
一個變數創建時,它不會自動地為在它之後創建的shell進程所知。而命令export可以向後面的shell傳遞變數的值。當一個shell腳本調用並執行時,它不會自動得到原為腳本(調用者)里定義的變數的訪問權,除非這些變數已經被顯式地設置為可用。export命令可以用於傳遞一個或多個變數的值到任何後繼腳本
5. 舉例
比如您在一個腳本里export $KKK=111 ,假如您用./a.sh執行該腳本,執行完畢後,您運行 echo $KKK ,發現沒有值,假如您用source來執行 ,然後再echo ,就會發現KKK=111。因為調用./a.sh來執行shell是在一個子shell里運行的,所以執行後,結構並沒有反應到父shell里,但是 source不同他就是在本shell中執行的,所以能夠看到結果.
小測試
1 建立test.sh
#!/bin/bash
export s=/home/jboss/
2 執行命令: source test.sh
echo $s
結果輸出: /home/jboss/
3 新開個shell
執行命令: ./test.sh
echo $s
結果: 沒有輸出s值

結論:
1、執行腳本時是在一個子shell環境運行的,腳本執行完後該子shell自動退出。
2、一個shell中的系統環境變數才會被復制到子shell中(用export定義的變數);
3、一個shell中的系統環境變數只對該shell或者它的子shell有效,該shell結束時變數消失(並不能返回到父shell中)。3、不用 export定義的變數只對該shell有效,對子shell也是無效的。

直接執行一個腳本文件是在一個子shell中運行的,而source則是在當前shell環境中運行的。
source可以讓腳本影響它們的父shell環境,這和export去影響子shell環境相反.

Ⅱ Linux寫一個shell腳本,要實現在鍵盤輸入一個進程號,輸出這個進程號的子進程pid,怎麼寫

這個只能找出子進程:
read-p"請輸入一個進程號:"value
wym=`ps-ef|sed-e's/[ ][ ]*/|/g'|cut-d"|"-f"2-4"|grep"|${value}|"|cut-d"|"-f"1"`
echo"它的子進程:"
echo"$wym"
這個可以找出所有的後代進程:通過遞歸調用本身函數。
read-p"輸入一個進程號:"p
functionmj(){
pid=`ps-ef|sed's/*/|/g'|cut-d"|"-f2-3|grep"|$1$"`
forppidin$pid;do
num=`echo"$ppid"|sed"s/|$1//g"`
echo"$num"
mj$num
done
}
mj$p

Ⅲ Linux編寫簡單的shell腳本

新建一個文件shell腳本一般用×.sh作為後綴當然勇氣他的也可以。打開終端輸入touch first.sh 新建一個名為first的shell腳本。
編寫一個簡單的linuxshell腳本

使用vim 編輯first.sh也可以用其他的文本編輯器,推薦使用vim

使用命令 vim first.sh打開,輸入i進入編輯模式。
編寫一個簡單的linuxshell腳本

我們寫入一個簡單的shell腳本,注意第一行的代碼解釋器的指定,這里使用的是/bin/bash/ 解釋器 也可用其他的根據個人情況自己選擇。

腳本解釋:

echo //顯示一串字元並自動換行

read NAME //從屏幕獲取一段字元,並賦予NAME

$NAME //取NAME變數的值

# //只用一個#表示注釋文本
編寫一個簡單的linuxshell腳本

文件寫完後按下esc鍵 退出插入模式,接著輸入:wq 保存文本並退出文本編輯。
編寫一個簡單的linuxshell腳本

輸入sh + 腳本名稱 運行腳本,或給文件可運行許可權 chmod +x 然後輸入./first.sh運行腳本。
編寫一個簡單的linuxshell腳本
編寫一個簡單的linuxshell腳本

Ⅳ linux shell腳本怎麼寫,才能實現關閉父進程的時候同時關閉子進程

你的想法實現不了
父進程調用外部腳本,產生一個新的子進程,子進程可以基礎父進程的環境變數,但是子進程的後續執行,不會影響父進程的環境

所以你想通過父來找子,shell下是找不到的
方法1、改腳本,把外部腳本放到A腳本中,不要調用了
方法2、kill 的時候 掃描兩個腳本的進程名,發現後,分別kill

Ⅳ Linux Shell 腳本編程最佳實踐

IT路邊社

前言

與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。

編碼規范對於程序員而言尤為重要,有以下幾個原因:

本文檔中的准則致力於最大限度達到以下原則:

盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。

:未明確指明的則默認為必須(Mandatory)

主要參考如下文檔:

僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。

在選擇何時使用shell腳本時時應遵循以下原則:

可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。

執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。

而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。

文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。

正例:

反例:

源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。

每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。

除了以下兩種情況例外:

如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。

示例:

除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。

對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。

Bash 是唯一被允許使用的可執行腳本shell。

可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:

使用 $(command) 而不是反引號。

因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。

正例:

反例:

條件測試

使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。

因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:

盡可能使用變數引用,而非字元串過濾。

Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:

反例:

正例:

反例:

正例:

反例:

文件名擴展

當進行文件名的通配符擴展時,請指定明確的路徑。

當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。

應該避免使用eval。

Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:

請使用進程替換或者for循環,而不是通過管道連接while循環。

這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。

這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:

如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:

使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:

總是檢查返回值,且提供有用的返回值。

對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。

例如:

當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。

因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。

正例:

反例:

載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:

反例:

除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。

正例:

除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:

反例:

推薦以下工具幫助我們進行代碼的規范:

原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/

獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取

腳本之---簡訊轟炸機

腳本之---QQ微信轟炸機

ansible---一鍵搭建redis5.0.5集群

elk7.9真集群docker部署文檔

全球最全loki部署及配置文檔

最強安全加固腳本2.0

一鍵設置iptbales腳本

Ⅵ shell腳本讓進程在後台運行以及進程後台轉前台

我們計算的程序都是周期很長的,通常要幾個小時甚至一個星期。我們用的環境是用 putty 遠程連接到日本 Linux 伺服器。所以使程序在後台跑有以下三個好處:

1:我們這邊是否關機不影響日本那邊的程序運行。(不會像以前那樣,我們這網路一斷開,或一關機,程序就斷掉或找不到數據,跑了幾天的程序只能重頭再來,很是煩惱)

2:不影響計算效率

3:讓程序在後台跑後,不會占據終端,我們可以用終端做別的事情。

方法有很多,這里主要列舉兩種。假如我們有程序 pso.cpp ,通過編譯後產生可執行文件 pso ,我們要使 pso 在 linux 伺服器後台執行。當客戶端關機後重新登入伺服器後繼續查看本來在終端輸出的運行結果。(假設操作都在當前目錄下)

方法1在終端輸入命令:

解釋:將 pso 直接放在後台運行,並把終端輸出存放在當前目錄下的 log.file 文件中。

當客戶端關機後重新登陸伺服器後,直接查看 pso.file 文件就可看執行結果(命令:$ cat pso.file )。
方法2在終端輸入命令:

解釋: nohup 就是不掛起的意思,將 pso 直接放在後台運行,並把終端輸出存放在當前

目錄下的 pso.file 文件中。當客戶端關機後重新登陸伺服器後,直接查看 pso.file

文件就可看執行結果(命令: #cat pso.file )。

註:如果要使在前天執行任務放到後台運行,則先要用 ctrl+z 掛起該任務,然後用 bg 使之後台執行。
附:
在 Linux 中,如果要讓進程在後台運行,一般情況下,我們在命令後面加上 & 即可,實際上,這樣是將命令放入到一個作業隊列中了:

對於已經在前台執行的命令,也可以重新放到後台執行,首先按 ctrl+z 暫停已經運行的進程,然後使用 bg 命令將停止的作業放到後台運行:

但是如上方到後台執行的進程,其父進程還是當前終端 shell 的進程,而一旦父進程退出,則會發送 hangup 信號給所有子進程,子進程收到 hangup 以後也會退出。如果我們要在退出 shell 的時候繼續運行進程,則需要使用 nohup 忽略 hangup 信號,或者 setsid 將將父進程設為 init 進程(進程號為 1 )

上面的試驗演示了使用 nohup/setsid 加上 & 使進程在後台運行,同時不受當前 shell 退出的影響。那麼對於已經在後台運行的進程,該怎麼辦呢?可以使用 disown 命令:

另外還有一種方法,即使將進程在一個 subshell 中執行,其實這和 setsid 異曲同工。方法很簡單,將命令用括弧() 括起來即可:

註:本文試驗環境為 Red Hat Enterprise Linux AS release 4 (Nahant Update 5) , shell 為 /bin/bash ,不同的 OS 和 shell 可能命令有些不一樣。例如 AIX 的 ksh ,沒有 disown ,但是可以使用 nohup -p PID 來獲得 disown 同樣的效果。

還有一種更加強大的方式是使用 screen ,首先創建一個斷開模式的虛擬終端,然後用 -r 選項重新連接這個虛擬終端,在其中執行的任何命令,都能達到 nohup 的效果,這在有多個命令需要在後台連續執行的時候比較方便:

Ⅶ linux下shell腳本執行問題

每個命令是一個進程,進程本身肯定就有一個線程,是否會有多進程或多線程,要看命令本身。
一般來說,命令執行完畢後才會去執行下一條命令,但有個例外,就是命令的最後加一個「&」符號,表示該命令進入後台運行,有這個符號的命令會立即返回,可以繼續執行下一條命令。進程之間都是shell的子進程。

Ⅷ linux如何用Shell編寫腳本獲取進程目錄下的cwd路徑和exe路徑

不知道你的系統是哪個發行版的
我寫了一個簡單的 在CentOS5.4下可用
輸出了每個進程的id對應的cwd路徑和exe路徑
XML/HTML code

#!/bin/bash
pid=`ps axu | grep "java" | grep -v "grep" | awk '{print $2}'`
for evry_pid in ${pid}
do
exe_path=`ls -l /proc/${evry_pid} | grep "exe ->" | grep -v "grep" | awk '{print $
NF}'`
cwd_path=`ls -l /proc/${evry_pid} | grep "cwd ->" | grep -v "grep" | awk '{print $
NF}'`
echo ${evry_pid}:
echo "exe_path:"${exe_path}
echo "cwd_path:"${cwd_path}
done

Ⅸ linux下如何寫個SHELL腳本,每天執行這么幾句命令:

1、登錄CentOS7系統,打開終端,輸入命令env shell列印出shell進程的環境變數。

Ⅹ 每天三分鍾搞定linux shell腳本24 後台模式運行

當運行腳本的時候在最後加上符號 & ,則對應的腳本在 後台運行 。建立腳本為,

輸入 ./test.sh & 運行

運行後1.txt文件會不斷增加內容,但是腳本以後台運行不會在終端佔用。運行結果為:

輸入 jobs 可以看到這個後台進程:

這個時候如果輸入exit,不會提示有後台進程在運行,而且後台進程也會退出。因為終端會話退出的時候會給這個後台進程發送一個 SIGHUP信號 。如果想要終端退出之後,進程不退出,可以讓進程捕獲SIGHUP信號。當然還有另一個方法,使用 nohup 指令運行腳本,比如輸入:

當用 nohup 並使用後台模式運行之後,即使退出終端,進程也不會收到SIGHUP信號。並且nohup會自動把標准輸出和標准錯誤重定向到nohup.out的文件中。

一個 運行的進程或者暫停的進程 都是一個作業,使用 jobs 命令可以查看當前的作業狀態。輸入:

我當前的輸出為:

(上面的作業2是輸入 ctrl+z 後暫停的進程)

其中, + 號被當作是默認作業,每個作業的前面有自己的序號。如果後續操作不加序號,那麼就被當做是在操作默認作業。比如使用 fg 指令前台運行作業,就是把27652這個進程前台運行,如果輸入 fg 1 ,那麼就是操作作業 1 了。帶-號的表示下一個默認作業。

輸入 bg 1 把 1號作業 後台運行,輸入 fg 2 把 2號作業 前台運行。

閱讀全文

與linuxshell腳本進程相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163