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

學(xué)無先后,達(dá)者為師

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

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

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

0. 概述

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

一、方法

1. 使用nohup執(zhí)行

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

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

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

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

在這里插入圖片描述

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

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

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

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

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

關(guān)于/dev/null

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

Linux的重定向

0:表示標(biāo)準(zhǔn)輸入;

1:標(biāo)準(zhǔn)輸出,在一般使用時(shí),默認(rèn)的是標(biāo)準(zhǔn)輸出;

2:表示錯(cuò)誤信息輸出。

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

./run.sh >/dev/null 2>&1表示將run.sh的錯(cuò)誤信息重定向到標(biāo)準(zhǔn)輸出,其他信息丟

2. 使用screen執(zhí)行

(1)基本用法

  • 安裝screen工具

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

說明:CentOS 6與CentOS 8操作系統(tǒng)版本結(jié)束了生命周期(EOL),按照社區(qū)規(guī)則,CentOS 6/8的源地址內(nèi)容已移除。當(dāng)您在CentOS 6/8系統(tǒng)內(nèi)繼續(xù)使用默認(rèn)配置的源地址時(shí)會(huì)發(fā)生報(bào)錯(cuò)。建議您先切換CentOS 6/8的源地址,然后再進(jìn)行操作。具體操作,請(qǐng)參見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)當(dāng)需要運(yùn)行腳本、執(zhí)行程序時(shí),在命令前添加screen即可。

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

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

此時(shí),可以退出ssh連接:

# 退出當(dāng)前窗口
exit

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

screen -r 16751

(2)進(jìn)階用法

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

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

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

  • 第二種方法:

不加選項(xiàng)-L,啟動(dòng)后,在screen session下按ctrl+a H,同樣會(huì)在當(dāng)前目錄下生成screenlog.0文件。

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

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

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

解決方法: 讓每個(gè)screen會(huì)話窗口有單獨(dú)的日志文件。

  • 第三種方法(推薦):

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

logfile /tmp/screenlog_%t.log

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

screen -L -t window1 -S test

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

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

(3)報(bào)錯(cuò)解決

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

(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個(gè)screen無法同時(shí)打開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

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