關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實現(xiàn)方式
一、前言
我們在使用linux時,會經(jīng)常要把一個程序放到后臺運行,這時候就需要在程序的最后使用【&】符號,但是當直接關(guān)閉這個終端時,程序就會退出
下面我介紹5種方法,在關(guān)閉終端后程序還繼續(xù)運行。
二、思考
首先要考慮一個問題,直接關(guān)閉終端為什么后臺程序就退出了?
那是因為直接關(guān)閉,終端會向當前環(huán)境啟動的后臺任務(wù)發(fā)送SIGHUP信號,讓運行的程序掛起,那么忽略SIGHUP信號就行啦。
三、nohup
最常用的命令就是【nohup】,從名字就看出是否掛起運行命令,關(guān)閉終端或者退出某個賬號,進程也繼續(xù)保持運行狀態(tài),同樣要配合【&】符號一起使用。
用法:nohup Command [ Arg … ] [&]
$ nohup sh test.sh & # 直接關(guān)閉當前終端,再打開一個查看 $ ps -few|grep test.sh

從上面的輸出可以看出,我們運行的test.sh的父進程變成了【PID 1】,由linux主進程接管。
四、setsid
nohup是忽略SIGHUP信號,那有沒有其他的思路?
使用setsid命令可以使程序打開新的進程,該進程繼承了父進程組的ID。
從下圖可以看到,test.sh腳本的父進程已經(jīng)是init 1,此時不管關(guān)閉還是退出終端,已經(jīng)和后臺的程序沒有關(guān)系了。
$ setsid sh test.sh

setsid與nohup的一個重要區(qū)別是:不需要使用&壓入后臺。
此法使運行的進程以root身份運行,多少有些安全隱患。
五、exit
使用exit命令退出終端,我們的程序還是會繼續(xù)運行,這是為什么呢?
這是因為使用exit命令退出終端時不會向終端所屬任務(wù)發(fā)SIGHUP信號,這是huponexit 配置項控制的,默認是off,可以使用shopt 命令查看。
[root@api ~]# shopt |grep huponexit huponexit off

將huponexit 配置成on,再次使用exit命令退出,所屬的任務(wù)就會跟隨退出。
[root@api ~]# shopt -s huponexit [root@api ~]# shopt |grep huponexit huponexit on
六、trap
trap命令是linux內(nèi)置的命令
trap [接收到指定信號時將要采取的行動] signal_spec
常見的信號如下:
| 信號 | 值 | 描述 |
|---|---|---|
| 1 | SIGHP | 掛起進程 |
| 2 | SIGINT | 終止進程 |
| 3 | SIGQUIT | 停止進程 |
| 9 | SIGKILL | 無條件終止進程 |
| 15 | SIGTERM | 盡可能終止進程 |
| 17 | SIGSTOP | 無條件停止進程,但不是終止進程 |
| 18 | SIGTSTP | 停止或暫停進程,但不終止進程 |
| 19 | SIGCONT | 繼續(xù)運行終止的進程 |
當一個腳本要在后臺運行,不希望終端退出后關(guān)閉腳本程序,我們可以在的腳本中增加trap命令來忽略SIGHUP信號(掛起進程)。
#!/bin/bash trap "" HUP while true;do date >> /root/test.txt sleep 1 done
七、screen
screen命令用于管理多個終端,它可以創(chuàng)建終端,讓程序在里面運行。
screen sh test.sh &

從上圖可以看出,test.sh腳本的父進程是screen終端進程【PID 7806】,而screen終端的父進程【PID 1】,同樣可以實現(xiàn)后臺的運行。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Apache No space left on device的解決辦法
[Fri Aug 15 10:54:31 2008] [emerg] (28)No space left on device: Couldn't create accept lockdf一下發(fā)現(xiàn)不是磁盤空間的問題。Google了一下就找到了解決方案,原來是系統(tǒng)的信號量(?)不夠用了。2008-08-08
Apache服務(wù)器中.htaccess的基本配置總結(jié)
這篇文章主要介紹了Apache服務(wù)器中.htaccess的基本配置總結(jié),可以很方便地實現(xiàn)一些權(quán)限分配等效果,需要的朋友可以參考下2015-07-07
Apache?Flink?如何保證?Exactly-Once?語義(其原理分析示例)
Apache?Flink?是一個流處理和批處理的開源平臺,它提供了豐富的語義保證,其中之一就是?Exactly-Once?語義,本文將深入探討?Flink?是如何保證?Exactly-Once?語義的,包括其原理分析和相關(guān)示例,感興趣的朋友跟隨小編一起看看吧2024-06-06
解決fatal:remote error:You can''t push to git://github.com/use
這篇文章主要介紹了解決fatal:remote error:You can't push to git://github.com/username/*.git問題的辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12

