xshell一直連接中斷 守護進程


last指令

重新登錄使用last指令查看登錄情況

 

pts的理解

who:查看目前有誰在線 

pts是所謂的偽終端或虛擬終端,具體表現就是你打開一個終端,這個終端就叫pts/0,如果你再打開一個終端,這個新的終端就叫pts /1。

 

守護進程

比如我們使用 ps -ef | grep nginx  里面有的會顯示pts 如果是?就是沒有在任何終端執行,在后台是守護進程

我們發現runserver 會有兩個進程

是因為django設置自動加載配置文件的原因。在運行命令后面可以加--noreload這樣就只會顯示一個進程,但是修改文件后,django不會主動去加載配置文件。

如果settings.py中DEBUG=False時,django不會處理靜態文件,這就可以使用--insecure參數強制django處理靜態文件.

 

創建守護進程

守護進程創建方法,linux下使用命令:

setsid python hello.py

作用就是:關閉終端,程序也可以后台運行。

 

退出守護進程

使用 ps -aux 可以查看當前進程。kill -9 [進程號]可關掉程序。

程序死掉也會退出進程

 

查找當前運行進程

Linux系統中grep命令是一種強大的文本搜索工具  可查找指定進程個數

ps -ef | grep nginx

grep --color=auto nginx 這個是自身命令的進程 不需要kill

ps -ef 表示顯示所有進程的消息

 
 
 

守護程序,后台運行

我們經常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結果卻由於網絡的不穩定導致任務中途失敗。如何讓命令提交后不受本地關閉終端窗口/網絡斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。

nohup/setsid/&  兩種方法都可以實現

在后台運行一般兩個一起用 :

nohup command &

setsid command 

nohup 與 & 區別

在於,是否有標准輸入

1. sh test.sh &

將sh test.sh任務放到后台 ,關閉xshell,對應的任務也跟着停止。

2. nohup sh test.sh

將sh test.sh任務放到后台,關閉標准輸入,終端不再能夠接收任何輸入(標准輸入),重定向標准輸出和標准錯誤到當前目錄下的nohup.out文件,即使關閉xshell退出當前session依然繼續運行。

3. nohup sh test.sh &

將sh test.sh任務放到后台,但是依然可以使用標准輸入,終端能夠接收任何輸入,重定向標准輸出和標准錯誤到當前目錄下的nohup.out文件,即使關閉xshell退出當前session依然繼續運行。

 

原理

hangup 名稱的來由:

在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發送 hangup 信號來通知其關閉所有子進程。

解決方法:我們知道,當用戶注銷(logout)或者網絡斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要么讓進程忽略 HUP 信號,要么讓進程運行在新的會話里從而成為不屬於此終端的子進程。

1. nohup (不掛斷地運行命令)

nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號。

可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標准輸出和標准錯誤缺省會被重定向到 nohup.out 文件中(當前文件夾)。一般我們可在結尾加上"&"來將命令同時放入后台運行,也可用">filename 2>&1"來更改缺省的重定向文件名。

重定向文件名

1. nohup command > myout.file 2>&1 &在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
2>&1是將標准錯誤(2)重定向到標准輸出(&1),標准輸出(&1)再被重定向輸入到myout.file文件中。
 
2.nohup 示例
[root@pvcent107 ~]# nohup ping www.ibm.com &
[1] 3059
nohup: appending output to `nohup.out'
[root@pvcent107 ~]# ps -ef |grep 3059
root 3059 984 0 21:06 pts/3 00:00:00 ping www.ibm.com
root 3067 984 0 21:06 pts/3 00:00:00 grep 3059
[root@pvcent107 ~]#

2.& (后台運行相當於新開了一個終端)

這里還有一個關於 subshell 的小技巧。我們知道,將一個或多個命名包含在“()”中就能讓這些命令在子 shell 中運行中,從而擴展出很多有趣的功能,我們現在要討論的就是其中之一。當我們將"&"也放入“()”內之后,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來查看的。讓我們來看看為什么這樣就能躲過 HUP 信號的影響吧。
subshell 示例 
[root@pvcent107 ~]# (ping www.ibm.com &)
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root 16270 1 0 14:13 pts/4 00:00:00 ping www.ibm.com
root 16278 15362 0 14:13 pts/4 00:00:00 grep www.ibm.com
[root@pvcent107 ~]#
從上例中可以看出,新提交的進程的父 ID(PPID)為1(init 進程的 PID),並不是當前終端的進程 ID。因此並不屬於當前終端的子進程,從而也就不會受到當前終端的 HUP 信號的影響了。

3. setsid(新開子進程)

nohup 無疑能通過忽略 HUP 信號來使我們的進程避免中途被中斷,但如果我們換個角度思考,如果我們的進程不屬於接受 HUP 信號的終端的子進程,那么自然也就不會受到 HUP 信號的影響了。setsid 就能幫助我們做到這一點。

setsid 示例

[root@pvcent107 ~]# setsid ping www.ibm.com

[root@pvcent107 ~]# ps -ef |grep www.ibm.com

root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com

root 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com

[root@pvcent107 ~]#

值得注意的是,上例中我們的進程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進程 ID),並不是當前終端的進程 ID。請將此例與nohup例中的父 ID 做比較。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM