網(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
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-05-18 Golang?并發(fā)下的問題定位及解決方案_Golang
- 2022-05-15 C++?Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行_C 語言
- 2022-07-06 Flutter?點(diǎn)擊兩次退出app的實(shí)現(xiàn)示例_Android
- 2022-12-22 python實(shí)現(xiàn)將list拼接為一個(gè)字符串_python
- 2022-12-12 Go語言開發(fā)前后端不分離項(xiàng)目詳解_Golang
- 2023-11-16 Linux查看某目錄下的文件個(gè)數(shù)
- 2022-04-01 kubernetes修改node的role標(biāo)簽
- 2022-08-15 使用element中el-table設(shè)置type=“expand“展開行隱藏小箭頭的方法(列表單選、
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支