使shell腳本后台執行,基本的方法有兩種,第一種為在腳本后面追加&符號,第二種為在腳本前面使用nohup命令,結尾再追加&符號
一、后台運行腳本1
1、執行腳本test.sh:./test.sh
2、中斷腳本test.sh:ctrl+c
3、在1的基礎上將運行中的test.sh,切換到后台並暫停:ctrl+z
4、執行ctrl+z后,test.sh在后台是暫停狀態(stopped),使用命令:bg number讓其在后台開始運行(“number”是使用jobs命令查到的 [ ]中的數字,不是pid)
5、直接在后台運行腳本test.sh:./test.sh &
6、查看當前shell環境中已啟動的任務情況:jobs
7、將test.sh切換到前台運行:fg %number(”number”為使用jobs命令查看到的 [ ] 中的數字,不是pid)
8、中斷后台運行的test.sh腳本:先fg %number切換到前台,再ctrl+c;或是直接kill %number
以上兩種在后台運行test.sh的方法,當遇到退出當前shell終端時,后台運行的test.sh也就結束了。這是因為以上兩種方法使得test.sh在后台運行時,運行test.sh進程的父進程是當前shell終端進程,關閉當前shell終端時,父進程退出,會發送hangup信號給所有子進程,子進程收到hangup以后也會退出。所以要想退出當前shell終端時test.sh繼續運行,則需要使用nohup忽略hangup信號。
二、不中斷后台運行腳本
1、不中斷的在后台運行test.sh:nohup ./test.sh &(test.sh的打印信息會輸出到當前目錄下的nohup.out中)
2、使用jobs可看到test.sh處於running狀態
3、使用ps -ef |grep test.sh可查看到正在運行的test.sh腳本進程
4、退出當前shell終端,再重新打開,使用jobs看不到正在運行的test.sh,但使用ps -ef可以看到
5、在后台不中斷的運行test.sh,可以使用nohup忽略hangup信號,或者使用setsid將其父進程改為init進程(進程號為1)
不中斷的在后台運行test.sh另一個命令:setsid ./test.sh &
使用ps -ef |grep test.sh可看到test.sh進程的父進程id為1