日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

Linux系統(tǒng)SSH客戶端斷開后保持進程繼續(xù)運行配置方法;Python等腳本在終端后臺運行的方法

作者:別出BUG求求了 更新時間: 2023-11-15 編程語言

0. 概述

在Linux系統(tǒng)中,通常我們在執(zhí)行一些運行時間比較長的任務時,必須等待執(zhí)行完畢才能斷開SSH連接或關閉客戶端軟件,否則可能會導致執(zhí)行中斷。本文介紹幾種保障程序在用戶退出登錄后持續(xù)運行的方法。

一、方法

1. 使用nohup執(zhí)行

nohup可以使后面的命令不會響應掛斷(SIGHUP)信號。也就是說,通過遠程登錄執(zhí)行nohup命令后,即使退出登錄后,程序還是會正常執(zhí)行。通常情況下,nohup命令最后會跟上&字符,表示將這個命令放至后臺執(zhí)行,這樣才能真正做到將這個命令放至后臺持續(xù)的執(zhí)行。具體示例如下所示。

提示:nohup通常用于執(zhí)行無干預的自動化程序或腳本,無法完成帶有交互的操作。

  • 執(zhí)行如下命令,每秒輸出一行信息。
bash hello.sh

系統(tǒng)顯示類似如下。

在這里插入圖片描述

  • 在命令頭尾分別加上nohup和&,如下所示,可以看到nohup輸出了一行信息,再按一下回車鍵就跳回了Shell命令行,此時命令已經(jīng)在后臺執(zhí)行了,nohup將命令的輸出重定向至當前目錄的nohup.out文件中。同時注意到nohup會將對應程序的PID輸出,PID可用于需要中斷進程時結(jié)束進程。
nohup bash hello.sh &

系統(tǒng)顯示類似如下。
在這里插入圖片描述

  • 通過如下命令,可以持續(xù)的查看nohup.out的輸出,達到監(jiān)視程序的效果
tail -f nohup.out
  • 在命令中也可以使用重定向?qū)⒊绦虻妮敵龈臑樽约合胍奈募缦滤荆瑒t程序的輸出就會寫到hello.log文件中
nohup bash hello.sh >hello.log &
  • 若程序不會自動退出,那么此時需要使用kill命令來結(jié)束進程。例如,可以使用如下命令,結(jié)束進程
kill -TRM [$PID]

說明:[$PID]為之前nohup命令輸出的值。

  • 如果不需要輸出日志的話,命令如下。
nohup ./run.sh >/dev/null 2>&1 &

關于/dev/null

/dev/null屬于字符特殊文件,它屬于空設備,是一個特殊的設備文件,它會丟棄一切寫入其中的數(shù)據(jù),寫入它的內(nèi)容都會永遠丟失,而且沒有任何可以讀取的內(nèi)容。它就像一個黑洞,我們一般會把/dev/null當成一個垃圾站,不要的東西丟進去。比如來清除文件中的內(nèi)容。

Linux的重定向

0:表示標準輸入;

1:標準輸出,在一般使用時,默認的是標準輸出;

2:表示錯誤信息輸出。

./run.sh >/dev/null 2>log表示將run.sh的錯誤信息輸出到log文件,其他信息丟進/dev/null。

./run.sh >/dev/null 2>&1表示將run.sh的錯誤信息重定向到標準輸出,其他信息丟

2. 使用screen執(zhí)行

(1)基本用法

  • 安裝screen工具

Linux系統(tǒng)默認沒有screen工具,需要先進行安裝。

說明:CentOS 6與CentOS 8操作系統(tǒng)版本結(jié)束了生命周期(EOL),按照社區(qū)規(guī)則,CentOS 6/8的源地址內(nèi)容已移除。當您在CentOS 6/8系統(tǒng)內(nèi)繼續(xù)使用默認配置的源地址時會發(fā)生報錯。建議您先切換CentOS 6/8的源地址,然后再進行操作。具體操作,請參見CentOS 6 EOL如何切換源?和CentOS 8 EOL如何切換源?。

CentOS系列系統(tǒng)安裝命令如下所示

yum install screen

Ubuntu 系列系統(tǒng)安裝命令如下所示

sudo  apt-get  install screen
  • 使用方法:
    (1)執(zhí)行如下命令,創(chuàng)建screen窗口。
screen -S [$Name]

screen -S [$Name]

(2)執(zhí)行如下命令,列出screen窗口

screen -ls

系統(tǒng)顯示類似如下。
在這里插入圖片描述
(3)當需要運行腳本、執(zhí)行程序時,在命令前添加screen即可。

(4)然后使用Ctrl和a鍵,再按下d鍵,就可以退出窗口,但不會影響screen程序的運行。

# 斷開當前窗口(繼續(xù)運行)
鍵入 ctrl + a + d

此時,可以退出ssh連接:

# 退出當前窗口
exit

(5)若需要繼續(xù)工作時,登錄實例,然后執(zhí)行如下命令-輸入剛剛創(chuàng)建的screen的號碼,恢復會話即可。

screen -r 16751

(2)進階用法

使用screen難免遇到這種情況,當screen輸出太長時屏幕滾動,不能看到全部信息。
解決這個問題可以將輸出打印到日志中。

  • 第一種方法:
    啟動時添加選項-L(Turn on output logging.),會在當前目錄下生成screenlog.0文件。
screen -L -dmS test #啟動一個開始就處于斷開模式的會話,會話的名稱是test
screen -r test #連接該會話,在會話中的所有屏幕輸出都會記錄到screenlog.0文件。

注: 如果執(zhí)行-L命令后看不到新建的日志,可能是文件讀寫權限不夠,e.g. sudo chmod 777
filename可以修改文件讀寫權限。

  • 第二種方法:

不加選項-L,啟動后,在screen session下按ctrl+a H,同樣會在當前目錄下生成screenlog.0文件。

第一次按下ctrl+a H,屏幕左下角會提示Creating logfile “screenlog.0”.,開始記錄日志。

再次按下ctrl+a H,屏幕左下角會提示Logfile “screenlog.0” closed.,停止記錄日志。

上面兩個方法有個缺點:當創(chuàng)建多個screen會話的時候,每個會話都會記錄日志到screenlog.0文件。screenlog.0中的內(nèi)容就比較混亂了。

解決方法: 讓每個screen會話窗口有單獨的日志文件。

  • 第三種方法(推薦):

在screen配置文件/etc/screenrc最后添加下面一行:

logfile /tmp/screenlog_%t.log

注意,如果寫成:logfile ./screenlog_%t.log 則是把日志文件記錄到當前目錄下
%t是指window窗口的名稱,對應screen的-t參數(shù)。所以我們啟動screen的時候要指定窗口的名稱,例如:

screen -L -t window1 -S test

意思是啟動test會話,窗口名稱為window1。屏幕日志記錄在/tmp/screenlog_window1.log。

如果啟動的時候不加-L參數(shù),在screen session下按ctrl+a H,日志也會記錄在/tmp/screenlog_window1.log。

(3)報錯解決

最近在使用screen 命令創(chuàng)建會話的時候,突然不小心將我的終端關閉了,然后重新連接再次打開我之前創(chuàng)建的會話的時候出現(xiàn)了下面這句錯誤:

(pytorch) root@dev-chq-caa:/private# screen -r 74308.n There is a
screen on:
74308.n (08/17/21 21:11:47) (Attached) There is no screen to be resumed matching 74308.n.

  • 原因:雖然重新連接,但之前的screen還是處于打開狀態(tài)(1個screen無法同時打開2次),所以無法重新打開screen

  • 解決方案

首先使用screen -d id,先退出。

(pytorch) root@dev-chq-caa:/private# screen -d 74308
[74308.n detached.]

然后再使用 screen -r id重新連接

原文鏈接:https://blog.csdn.net/weixin_39589455/article/details/128459897

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新