網(wǎng)站首頁 編程語言 正文
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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-09-19 Android實現(xiàn)斷點續(xù)傳功能_Android
- 2021-12-01 C++?解決求兩個鏈表的第一個公共結(jié)點問題_C 語言
- 2022-09-25 springBoot自動裝配的原理
- 2022-10-06 Django數(shù)據(jù)映射(一對一,一對多,多對多)_python
- 2022-12-10 C++中的結(jié)構(gòu)體vector排序問題_C 語言
- 2022-10-01 使用python+Flask實現(xiàn)日志在web網(wǎng)頁實時更新顯示_python
- 2023-12-13 記錄choice函數(shù)用法
- 2022-06-15 ASP.NET?Core?MVC中的控制器(Controller)介紹_基礎應用
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支