1. 程式人生 > >解決Linux關閉終端(關閉SSH等)後執行的程式自動停止

解決Linux關閉終端(關閉SSH等)後執行的程式自動停止

問題描述:

之前在伺服器上起一個python的服務,放到後臺執行。 python pyserver.py &. 當我關閉這個SSH之後,該服務不可用,再次登入到伺服器,已經沒有這個python程序啦。

問題定位:

通過上面問題的表象,可以發現是跟SSH關閉有關。為什麼ssh關閉,會導致正在執行的程式死掉。通過檢視相關的資料,發現真正的元凶是SIGHUP訊號導致的。

在linux中,有下面幾個概念:

程序組: 一個或多個程序的集合,每一個程序組都有唯一一個程序組ID,即程序組
會話器: 一個或多個程序組的集合,有唯一一個會話期首程序(session leader)。會話期ID為首程序的ID。
控制程序: 與控制終端連線的會話期首程序叫做控制程序.
當前與終端互動的程序稱為前臺程序組。其餘程序組稱為後臺程序組。

一般縮寫:

PID = 程序ID (由核心根據延遲重用演算法生成)
PPID = 父程序ID(只能由核心修改)
PGID = 程序組ID(子程序、父程序都能修改)
SID = 會話ID(程序自身可以修改,但有限制,詳見下文)
TPGID= 控制終端程序組ID(由控制終端修改,用於指示當前前臺程序組)

會話和程序組的關係:

每次使用者登入終端時會產生一個會話(session)。從使用者登入開始到使用者退出為止,這段時間內在該終端執行的程序都屬於這一個會話。

每個程序除了有一程序ID之外,還屬於一個程序組(Process Group)。程序組是一個或多個程序的集合,每個程序組有一個唯一的程序組ID。多個程序屬於程序組的情況是多個程序用管道“|”號連線進行執行。如果在命令列執行單個程序時這個程序組只有這一個程序。

結束通話訊號(SIGHUP)預設的動作是終止程式。

當終端介面檢測到網路連線斷開,將結束通話訊號傳送給控制程序(會話期首程序)。如果會話期首程序終止,則該訊號傳送到該會話期前臺程序組。一個程序退出導致一個孤兒程序組中產生時,如果任意一個孤兒程序組程序處於STOP狀態,傳送SIGHUP和SIGCONT訊號到該程序組中所有程序。

因此當網路斷開或終端視窗關閉後,也就是SSH斷開以後,控制程序收到SIGHUP訊號退出,會導致該會話期內其他程序退出。

解決的辦法

  • nohup命令:

如果你正在執行一個程序,而且你覺得在退出帳戶時該程序還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續執行相應的程序。nohup就是不掛起的意思。

我們現在開始啟動服務 python pyserver.py,並且希望在後臺執行.我們就可以使用nohup,命令如下:

nohup python pyserver.py &

此時預設地程式執行的輸出資訊放到當前資料夾的nohup.out 檔案中去,加不加&並不會影響這個命令。只是讓程式前臺或者後臺執行而已。

  • nohup命令說明:

用途:不掛斷地執行命令。
語法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令執行由 Command 引數和任何相關的 Arg 引數指定的命令,忽略所有結束通話(SIGHUP)訊號。在登出後使用 nohup 命令執行後臺中的程式。要執行後臺中的 nohup 命令,新增 & ( 表示“and”的符號)到命令的尾部。

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 檔案中。如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $HOME/nohup.out 檔案中。如果沒有檔案能建立或開啟以用於追加,那麼 Command 引數指定的命令不可呼叫。如果標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的檔案描述符。

  • 退出狀態:該命令返回下列出口值:

126 可以查詢但不能呼叫 Command 引數指定的命令。
127 nohup 命令發生錯誤或不能查詢由 Command 引數指定的命令。
否則,nohup 命令的退出狀態是 Command 引數指定命令的退出狀態。

使用 jobs 檢視任務,使用 fg %n關閉。

延伸:

為什麼守護程式就算ssh 開啟的,就算關閉ssh也不會影響其執行?

因為他們的程式特殊,比如httpd –k start執行這個以後,他不屬於sshd這個程序組 而是單獨的程序組,所以就算關閉了ssh,和他也沒有任何關係!

[[email protected] ~]# pstree |grep http
|-httpd
[[email protected] ~]# pstree |grep top
|-sshd-+-sshd—bash—top

守護程序的啟動命令本身就是特殊的,和一般命令不同的,比如mysqld_safe 這樣的命令 一旦使用了 就是守護程序執行。所以想把一般程式改造為守護程式是不可能。

相關推薦

解決Linux關閉終端(關閉SSH)執行程式自動停止

問題描述: 之前在伺服器上起一個python的服務,放到後臺執行。 python pyserver.py &. 當我關閉這個SSH之後,該服務不可用,再次登入到伺服器,已經沒有這個python程序啦。 問題定位: 通過上面問題

SSH整合執行流程

為什麼一定要知道整合後的執行流程呢? 在深度瞭解框架以後,才能在專案執行以後,報錯的時候,能夠很快的找到問題所在。 SSH框架的專案執行流程:(文字解析) 1.伺服器啟動,建立Struts2的過濾器的控制器,建立春容器物件。    例項化Struts2的控制器時,載入

windows中定時關閉並延時開啟某個執行程式

首先熟悉這個命令taskkill,具體怎使用不過多的解釋,自己可以去搜索瞭解一下。 結束應用程式用 taskkill /im QQ.exe /f    QQ.exe是我要結束的程序。 可以在工作管理員裡看到你想關閉的程式的程序。 然後儲存上面的一條命令為bat格式。 注意

關閉指定埠號+bat檔案執行程式

>netstat -aon | findstr “80″Proto   Local Address           Foreign Address         State             PID====   ============       ===

解決Windows XP中工作列不顯示執行程式按鈕的故障

    故障現象:程式在執行,但是工作列卻不顯示相應的按鈕,導致多個程式同時執行時,無法從工作列迅速切換,只能用 Alt+TAB 鍵切換,既慢又不直觀,還經常錯誤切換到其他程式。   解決過程:一直不太敢用網上所謂修改、強化工作列的軟體,怕有垃圾程式碼/病毒/後門/木馬/惡意

Linux 1.0核心原始碼剖析】執行程式——exec.c

父程序 fork的子程序的目的自然不是建立一個幾乎與自己一模一樣的程序。而是通過子程序呼叫 exec 函式簇去執行另外一個程式。exec() 系統呼叫必須定位該執行檔案的二進位制映像,載入並執行它。 exec() 的Linux實現支援不同的二進位制格式,這是通過 linux

android 開發問題集(一):SDK更新 執行程式報錯Location of the Android SDK has not been setup in the preferences

問題描述:android跟新後報錯location of the android sdk has not been setup in the preferences。eclipse裡的SDK Manager也打不開 原因:android跟新後ADT的版本過低造成的,但是有的人又因為跟新ADT失敗導致,也

Linux程序啟動過程分析do_execve(可執行程式的載入和執行)---Linux程序的管理與排程(十一)

execve系統呼叫 execve系統呼叫 我們前面提到了, fork, vfork等複製出來的程序是父程序的一個副本, 那麼如何我們想載入新的程式, 可以通過execve來載入和啟動新的程式。 x86架構下, 其實還實現了一個

Linux核心裝載和啟動一個可執行程式

      首先,我們需要了解,什麼是可執行程式。可執行程式是一種可以被計算機識別的程式,是原始碼經過預處理、編譯、連結等步驟後形成的程式,大體關係如下圖所示。                                      圖1.c語言程式執行流程    

解決Linux關閉終端關閉SSH執行程式或者服務自動停止【後臺執行程式

 問題描述:當SSH遠端連線到伺服器上,然後執行一個服務 ./catalina.sh start,然後把終端開閉(切斷SSH連線)之後,發現該服務中斷,導致網頁無法訪問。 解決方法:使用nohup命令讓程式在關閉視窗(切換SSH連線)的時候程式還能繼續在後臺執行。

如何在Linux中使SpringBoot專案關閉終端關閉專案程序

    編寫一個shell指令碼,名字是startup.sh #!/bin/sh nohup java -jar /usr/Bean/FoodSystem.jar &   執行指令碼 ./startup.sh 出現下圖問題,

解決linux下source /etc/profile關閉終端失效問題

本來想配置環境變數的,看網上和部落格上很多說改/etc/profile,然後source /etc/profile之後就可以永久儲存使環境變數生效,但是終端一關閉,就環境變數就失效了,其他終端也用不了。網上有說在當前使用者目錄下建立.bash_profile檔案,編寫環境變數

mongdb 終端關閉,服務也退出關閉的問題解決

昨天發現系統宕機了,查了下原因是mongodb服務停了,看了下日誌: 1 2017-10-18T18:09:59.181+0800 I CONTROL  [signalProcessingThread] got signal 1 (Hangup), will terminate after

[Linux]在終端啟動程序關閉終端不退出的方法

con test track post hup 命令 -a ont 終端 ?? 在終端啟動程序關閉終端不退出的方法 普通情況下關閉終端時,那麽在這個終端中啟動的後臺程序也會終止。要使終端關閉後,後臺程序保持運行,使用這個指令: nohup 命令 & 如:n

解決kali linux 開啟ssh服務連接不上的問題

手機端 linu otl sshd pro 密碼 auth cati nbsp 今天在手機端裝了NetHunter 想連接PC的kali ,可是怎麽都連不上 綜合網友的經驗: 1.修改sshd_config文件,命令為:vi /etc/ssh/sshd_config

解決3D Max2014關閉程序,打開停止工作

img com size 打開 停止 ctp 工作 下載鏈接 9.png 批處理下載鏈接:https://pan.baidu.com/s/1qQKcTpjlm3ZGmqoZP1lvxg 密碼:422t 解決3D Max2014關閉程序,打開後停止工作

問題記錄之關於linux下shutdown關閉不掉tomcat問題的解決辦法

關於linux下shutdown關閉不掉tomcat問題的解決辦法解決問題的辦法: 方法二:強制殺程序 1.找到tomcat下bin/catalina.sh檔案,vi進去新增點東西,主要是記錄tomcat的pid,如下: #設定CATALINA_PID(後加) if [ -z "$CATALINA_P

解決linux登入總是時間過會就斷開(解決ssh登入閒置時間過長而斷開連線)

1.vim /etc/ssh/sshd_config 配置如下圖: 2.systemctl reload sshd.service (針對阿里雲centos7(貌似阿里雲的都是這樣) 其他別的伺服器使用:service sshd reload     兩行命令搞定。 &nb

Linux 命令列關閉開啟顯示器及xset: unable to open display ""解決方法

在遠端連線Linux等時,基本用不到顯示器,所以希望能遠端將顯示屏關閉 xset -display :0.0 dpms force off這個命令讓顯示屏進入休眠狀態 xset -display :0.0 dpms force on開啟顯示屏 sleep 1 && xse

Linux前臺的程式轉到後臺執行(並且關閉終端而不殺死命令)

通過SSH或者終端putty連線到一臺linux/unix機器,執行一個程式、一個指令碼或者一條命令,但現在你需要關閉SSH或者終端,由於該該程式、指令碼或者命令正在執行,一旦你直接關閉而不做任何處理這個程序就會一起關閉,做到一半的工作浪費掉了 下面介紹一種方法可以在需要關閉