Linux 環境下程序不間斷運行

1、背景
    在linux命令行中執行程序,程序一般會佔用當前終端,若是不啓動新的終端就無法執行其餘操做。簡單能夠經過'&'將程序放到後臺執行,可是這種方法有個問題就是,一旦鏈接遠程服務器的網絡異常或者本機ssh客戶端、系統等關閉亦或出現問題致使鏈接斷開,那麼放到後臺執行的程序就會被終止。
    對於須要長時間運行的守護進程或者服務端程序這種異常斷開形成的進程終止不可接受。下面就介紹三種解決這種問題的通用方案(不涉及程序改造)
 
2、nohup命令
    在啓動程序命令後面添加&將程序放到後臺做業隊列中,管理任務隊列中任務能夠經過jobs等命令。
    可是任務隊列中的任務一般狀況下,其父進程都是當前終端的shell進程。而一旦父進程退出,則會發送hangup信號給全部子進程,子進程收到hangup之後也會退出。咱們能夠經過讓後臺進程忽略來自父進程的hangup信號或者修改後臺進程的父進程id來避免後臺進程退出。使用nohup命令執行的命令nohup ./tesh.sh & 能夠忽略hangup信號(須要啓動程序時將程序放到後臺執行,不然關閉終端依然會致使進程結束),使用setsid命令  setsid ./test.sh & 能夠將當前程序的父進程設置爲init進程,這樣就不會收到當前shell進程發出的hangup信號了。具體用法以下:
新啓動程序
nohup ./test.sh >log 2>&1 &
setsid ./test.sh >log 2>&1 &
已運行程序
nohup -p PID
disown -h %n
  
  注:nohup命令會將所執行的命令的標準輸出重定向到當前目錄的nohup.out文件中(若是命令中沒有重定向標準輸出),可是不會重定向標準錯誤輸出。其他的setsid、disown只是修改進程的sid,使其與當前shell脫離,可是並無改變原命令的標準輸出、標準錯誤輸出,因此這些後臺運行的進程,當須要標準輸出或標準錯誤輸出的時候,發現默認的輸出位置終端不可用,就會報異常退出。所以, 在運行後臺進程時,儘可能將利用 >log 2>&1 對命令的輸出進行重定向(如表格中第一行)。
 
3、screen命令
    GNU Screen能夠看做是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能,大部分Linux發行版都默認帶有screen。經過將screen會話與當前終端shell進程detach來避免當前終端shell的異常致使的screen中運行的程序的終止。
screen -S NAME
screen -S sxhlinux
新建一個名爲sxhlinux的screen會話
screen -ls
screen -ls
查看當前系統中全部的screen會話
screen -d NAME
screen -d sxhlinux
將sxhlinux會話與當前shell終端分離
screen -r NAME
screen -r sxhlinux
在當前shell進程中與名爲sxhlinux的進程從新鏈接
screen -R NAME
screen -R sxhlinux
同-r選項,另外若是sxhlinux不存在,
就會從新新建一個名爲sxhlinux的screen會話
screen -x NAME 
screen -x sxhlinux
多個終端同時操做名爲sxhlinux的screen會話,操做同步可見
 
在每一個screen 會話中都有以下快捷鍵可使用
ctrl-a c
在當前會話中建立一個新的的shell窗口
ctrl-a n/p
切換到下/上一個窗口
ctrl-a d
使當前會話與原shell detach
ctrl-a w
列出當前會話中的全部窗口
ctrl-a k
關閉當前窗口
ctrl-a x/q
鎖定、解鎖當前窗口
ctrl-a [/]
[啓動複製模式(vi操做習慣),第一次空格鍵表示開始複製,第二次空格表示結束複製;
]將[複製的內容粘貼到當前位置
ctrl-a S/|
將當前屏幕水平/垂直分紅兩部分,能夠經過ctrl-a TAB來切換
能夠修改/etc/screenrc或者~/.screenrc配置文件來配置screen,選項vbell off/on 控制錯誤閃屏提醒。本文關注點在保證用戶程序不因終端、網絡異常等問題形成程序運行中斷,所以這裏有關screen只進行簡單的介紹,有興趣的能夠搜索相關文章或者看官方document。
 
4、tmux命令
    雖然screen很好用,可是已經不少年沒有添加新特性了,還存在一些bug。做爲screen的替代者,tmux在各方面徹底能夠替代甚至超過screen,惟一的缺點是Linux發行版沒有默認安裝tmux,須要用戶聯網安裝。下面就簡單介紹tmux的使用方法:
tmux new -s NAME 
tmux new -s sxhlinux
建立一個
tmux detach -s NAME
tmux detach -s sxhlinux
將sxhlinux會話分離
tmux attach -t NAME
tmux a -t sxhlinux
從新鏈接sxhlinux會話
tmux ls
tmux ls
列出當前全部的tmux會話
tmux lsc [-t NAME]
tmux lsc [-t sxhlinux]
列出全部[鏈接到sxhlinux]的客戶端
tmux rename -t OLD NEW
tmux rename -t sxh sxhlinux
將會話sxh重命名爲sxhlinux
tmux kill-session -t NAME
tmux kill-session -t sxhlinux
關閉sxhlinux會話
 
tmux默認的快捷鍵組合前綴爲ctrl b,不過爲了和screen習慣保持一致,咱們能夠修改tmux的配置文件~/.tmux.conf來說組合前綴改爲ctrl a
ctrl-a c
同screen
ctrl-a d
同screen
ctrl-a f
在當前會話全部打開的窗口中搜索文本
ctrl-a n/p
同screen
ctrl-a &
關閉當前窗口
ctrl-a x
關閉當前會話
    修改的tmux配置文件以下(注:#以及後面的內容僅作說明,實際使用的時候請刪除)
set -g prefix C-a   #配置快捷鍵前綴爲ctrl a
unbind C-b    #取消快捷鍵前綴ctrl b
unbind '%' #取消左右分pane的快捷鍵 %
bind | splitw -h    #指定左右分pane的快捷鍵 |
bind k selectp -U #指定選擇上方pane的快捷鍵  k
bind j selectp -D #指定選擇上方pane的快捷鍵  j 
bind h selectp -L #指定選擇上方pane的快捷鍵  h 
bind l selectp -R #指定選擇上方pane的快捷鍵  l
 
一般狀況下,若是系統重啓原來的tmux會話就會丟失(由於tmux由一個server進程來保存相關會話信息,系統重啓原來的server進程消失,因此以前的tmux會話也就不存在了)安裝tmux-continuum插件解決tmux會話不能保存的問題。
  1. tmux-continuum插件要求tmux版本爲1.9以上,目前CentOS 7 上的版本爲1.8。 因此,須要咱們去github的tmux項目中下載新版本的 tmux替換系統中已有的老版本。
  2. 下載並安裝tmux插件 git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
  3. 編輯 ~/.tmux.conf文件,並在最後追加以下內容
    # Edit ~/.tmux.conf and added lines below at the bottom 
    set -g @plugin 'tmux-plugins/tpm'
    set -g @plugin 'tmux-plugins/tmux-sensible'
    set -g @plugin 'tmux-plugins/tmux-resurrect'
    set -g @plugin 'tmux-plugins/tmux-continuum'
    set -g @continuum-restore 'on'
    
    # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
    run '~/.tmux/plugins/tpm/tpm'
    
  4. 執行 tmux new -s test 建立一個臨時的session,而後在session中執行 ctrl-a I 組合鍵安裝tmux-continuum。安裝完成後ctrl-d結束當前session。至此continuum插件安裝完成。

  參考資料:https://github.com/tmux/tmux           https://github.com/tmux-plugins/tpm         https://github.com/tmux-plugins/tmux-continuumlinux

 
5、總結
    nohup通常做爲啓動服務或者守護進程來執行一個單獨的命令的情形下使用( 記得輸出重定向);screen和tmux能夠做爲平常鏈接遠程開發服務器作開發使用,能夠方便的切換各類工做臺,而不用打開多個終端。
相關文章
相關標籤/搜索