Linux学习之后台运行进程
前言
有的時候我們希望Linux的命令行能運行一個程序,然后把它放在后臺,讓其自己運行,尤其是云服務器運行單線程程序,TCP服務器開啟一個while(true)循環監聽一個端口,這時命令行就死在那等著,我們想像Windows那樣,把它"最小化",放在后臺讓其自己玩。主要介紹3種方法,以下方法均在服務器和虛擬主機中實現。
服務器
運行環境:阿里云服務器 ECS 2核2 GiB
操作系統:Ubuntu 20.04 64位
網絡帶寬:1Mbps
虛擬主機
主機:聯想Y7000P;64位windows10;CPU:i7-9750H;顯卡:GTX 1660 Ti;內存:16G
虛擬機:Ubuntu 18.04 LTS;硬盤100G;內存4G;64位;4核心
Linux內核:5.11.8
本文原創,創作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/?p=165
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/116009949
準備工作
我們先來一個程序讓其運行,我用的是Python中的socket 服務器示例代碼,它是一個while(true),阻塞式等待客戶端的連接。
代碼來自:Python3 網絡編程
這是源碼:
先看直接運行的效果
可以看到,命令行一直阻塞在這里,等待客戶端的連接,要想繼續用此終端,只能Ctrl+C強制關閉這個程序,所以需要讓其后臺運行。
“&” 字符
本方法參考自:
快樂的 Linux 命令行
http://billie66.github.io/TLCL/
P128 11.6 把一個進程放置到后臺 (執行)部分
啟動任務
為了啟動一個程序并讓它立即在后臺運行,我們在程序命令之后,加上 “&” 字符,如圖,執行命令之后,程序運行的提示信息出現,并且 shell 提示符返回,同時打印一些有趣的數字。這條信息是 shell 特性的一部分,叫做任務控制 (job control)。通過這條信息,shell 告訴我們,
已經啟動了任務號 (job number) 為 1(“[1]”),PID 為 14974 的程序。如果運行 ps 命令,
可以看到運行的進程,我這里有3個其中python3就是服務器在后臺運行。
shell 的任務控制功能給出了一種列出從我們終端中啟動了的任務的方法。執行 jobs 命令,
我們可以看到上圖這個輸出列表,結果顯示我們有一個任務,編號為“1”,它正在運行,并且這個任務的命令是python3 serverDemo.py &。這時就可以用客戶端去連接了,而且這個終端還可以繼續用。
切換任務
一個在后臺運行的進程對一切來自鍵盤的輸入都免疫,也不能用 Ctrl-c 來中斷它。為了讓一個
進程返回前臺 (foreground),這樣使用 fg 命令:
fg 命令之后,跟隨著一個百分號和任務序號(叫做 jobspec, 如此處的%1)就可以了。如
果我們只有一個后臺任務,那么 jobspec(job specification) 是可有可無的。這樣就把任務切換到了前臺了。
這時我們就可以繼續操作啟動的那個進程了。
結束任務
結束任務可以用萬能的Ctrl+C,結束任務。
先把后臺的進程用fg %序號,切換到前排,然后輸入Ctrl+C就可以結束進程了。
以上命令均在阿里云服務器上運行成功!!!
screen命令
參考資料:Linux screen命令
screen指令結構:
我常用的就是:
-d<作業名稱> 將指定的screen作業離線 -r<作業名稱> 恢復離線的screen作業 -ls或--list 顯示目前所有的screen作業。 -m 即使目前已在作業中的screen作業,仍強制建立新的screen作業 -S <作業名稱> 指定screen作業的名稱。注意在-S后面的""中需要填寫英文的名字用于返回終端安裝screen
下面先在虛擬機Ubuntu下運行一下基本的
輸入screen -v,看一下是否安裝了srceen指令。
沒有,輸入
然后等待其自己安裝完,安裝完之后,輸入screen -v查看結果
如果輸入install指令提示沒找到,可以嘗試更新一下系統的鏡像源,如果是云服務器,可以輸入sudo apt update直接更新
創建任務
輸入screen -S "Pythonserver" python3 serverDemo.py
創建一個作業,名稱為"Pythonserver",后邊接的是要運行的指令。然后屏幕就會跳轉到"Pythonserver"中,如果想要返回終端中,按下Ctrl+A,然后都松開,然后再按下D鍵就行了。
如果不想彈出來,而是想直接讓其再后臺運行,可以在-S前加上-d和-m的參數,讓其直接在后臺掛起,例如:
screen -d -m -S "Pythonserver" python3 serverDemo.py
切換任務
可以輸入screen -ls來查看當前screen運行的任務列表,然后用
screen -r "任務名稱" 或者 screen -r 序號切換到任務
如果是用名字輸入的話,要加上雙引號,用序號的話不用,序號就是名稱前的
切換回來也是一樣的,按下Ctrl+A,然后都松開,然后再按下D鍵
結束任務
可以先用screen -r 序號切換到任務中,然后,按下Ctrl+C,強制結束任務
也可以在終端中輸入kill 序號強制結束任務
以上命令均在阿里云服務器上運行成功!!!
tmux命令
參考資料:Tmux 使用教程
Tmux 是一個終端復用器(terminal multiplexer),看一下資料中提到的tmux作用,如有侵權,請聯系我刪除!
安裝tmux
先輸入tmux,看本機是否安裝了tmux
看來沒有,然后輸入
等待其安裝完就行了。
啟動tmux
在終端中,輸入tmux就行了
底部是狀態欄,左側是窗口編號,右側是系統的信息。
按下Ctrl+D或者輸入exit,就可以退出 Tmux 窗口。
前綴快捷鍵
Tmux 窗口有大量的快捷鍵。所有快捷鍵都要通過前綴鍵喚起。默認的前綴鍵是Ctrl+B,即先按下Ctrl+B,快捷鍵才會生效。
舉例來說,幫助命令的快捷鍵是Ctrl+b ?
它的用法是,在 Tmux 窗口中,先按下Ctrl+b,再按下?,就會顯示幫助信息。
然后,按下 ESC 鍵或q鍵,就可以退出幫助。
啟動任務
第一個啟動的 Tmux 窗口,編號是0,第二個窗口的編號是1,以此類推。這些窗口對應的會話,就是 0 號會話、1 號會話。
有的時候使用編號區分會話,不太直觀,更好的方法是為會話起名。
上面命令新建一個指定名稱的會話。
然后就是在后臺掛起進程終端。
在 Tmux 窗口中,按下Ctrl+B,松開,然后按下D鍵 或者 輸入tmux detach命令,就會將當前會話與窗口分離,就會退出當前 tmux 窗口,但是所運行的tmux不會結束,會掛在后臺
切換任務
啟動之后,返回系統終端之后,可以輸入tmux ls查看當前掛在后臺的tmux窗口。
如果想要從系統終端返回到tmux界面,輸入
就可以切換回對應的tmux界面了。
如果是已經在tmux界面中,想要切換到其他tmux界面中,可以輸入
就可以在不同的tmux窗口中切換了。
如果想要換名字可以用tmux rename-session命令用于重命名會話。
tmux rename-session -t 序號 <new-name>結束任務
結束任務可以在想要結束tmux中輸入exit指令,或者按下Ctrl+D。
如果是在系統終端中,可以用tmux kill-session指令刪除tmux窗口
以上命令均在阿里云服務器上運行成功!!!
其實tmux還有很多很多便利的快捷鍵和便捷的多窗口操作方式,具體的在上方的參考資料里都有,有需要的可以自行查詢。
總結
其實,對于虛擬機中的Ubuntu系統下,貌似多任務模式意義不大,因為Ubuntu的終端是有最小化的按鈕的,而且還可以直接打開多個終端。
然后在云服務器中,雖然只有終端界面,但是也可以開啟多個終端,不過還是要掌握一下,把程序掛起在后臺,讓其自己運行的方法,尤其是對于一些單線程的程序。 =w=
總結
以上是生活随笔為你收集整理的Linux学习之后台运行进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3倍根号x加1分之一c语言,用C语言将一
- 下一篇: 服务器主机安装esxi虚拟机,服务器主机