1、連接上相應的linux主機,進入到等待輸入shell指令的linux命令行狀態(tài)下。
成都創(chuàng)新互聯(lián)技術團隊十余年來致力于為客戶提供成都網(wǎng)站建設、做網(wǎng)站、高端網(wǎng)站設計、營銷型網(wǎng)站、搜索引擎SEO優(yōu)化等服務。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗豐富的技術團隊,先后服務、推廣了超過千家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機構(gòu)單位。
2、在linux命令行下輸入shell指令:ps -ef | grep ftp。
3、最后,按下回車鍵執(zhí)行shell指令,此時會看到ftp進程被成功查詢到,說明ftp功能是開啟狀態(tài)。
有些時候,我們需要在終端啟動一個程序,并使之運行——但是如果關閉終端,那么這個程序也就隨著關閉了。那么有沒有什么方法在關閉終端后,讓已經(jīng)從這個終端啟動的程序繼續(xù)運行呢?有以下方法
1.讓linux忽略終端的hung up 信號,不關閉進程;
2.讓此進程變?yōu)榻K端的非子進程。
方法一:
在終端輸入命令:
# ./pso pso.file 21
解釋:將pso直接放在后臺運行,并把終端輸出存放在當前目錄下的pso.file文件中。
當客戶端關機后重新登陸服務器后,直接查看pso.file文件就可看執(zhí)行結(jié)果(命
令:#cat pso.file )。
或者 在終端輸入命令:
# nohup ./pso pso.file 21
解釋:nohup就是不掛起的意思,將pso直接放在后臺運行,并把終端輸出存放在當前
目錄下的pso.file文件中。當客戶端關機后重新登陸服務器后,直接查看pso.file
文件就可看執(zhí)行結(jié)果(命令:#cat pso.file )。
方法二:
實現(xiàn)方案就是nohup命令。
例如要啟動jboss,可以nohup ./run.sh 。這樣就可以了,結(jié)尾的“”符號表示后臺啟動jboss,從而不影響繼續(xù)運行其他命令。
但這樣有一個問題,nohup命令雖然可以讓linux“放過”這個進程,但是nohup會同時把進程的控制臺輸出重定向到nohup.txt下(默認是這個文件),當然可以重定向為其他的文件,但是輸出總會有的。
如果jboss運行很長時間,而且如果有很多控制臺輸出的話,nohup.txt文件就會變的很大很大。
通常項目中的日志都會輸出到特定的日志文件或者輸出到 數(shù)據(jù)庫 中,也就是說控制臺的輸出對于程序的意義不大,那么可不可以拋棄掉這些輸出呢?答案是肯定的。
這里講解一下linux的重定向(注意,是linux的重定向,不是針對nohup)。
0、1和2分別表示標準輸入、標準輸出和標準錯誤信息輸出,可以用來指定需要重定向的標準輸入或輸出。
在一般使用時,默認的是標準輸出,既1.當我們需要特殊用途時,可以使用其他標號。例如,將某個程序的錯誤信息輸出到log文件中:./program 2log。這樣標準輸出還是在屏幕上,但是錯誤信息會輸出到log文件中。
另外,也可以實現(xiàn)0,1,2之間的重定向。21:將錯誤信息重定向到標準輸出。
Linux下還有一個特殊的文件/dev/null,它就像一個無底洞,所有重定向到它的信息都會消失得無影無蹤。
結(jié)合nohup,我們可以這樣 nohup ./run.sh /dev/null
這是最簡單的一種方式,既保證了程序能夠一直后臺執(zhí)行,又能保證不會產(chǎn)生太大的nohup.txt文件。
方法三:
利用的linux的一個機制,讓程序在subshell中執(zhí)行,方法很簡單,將命令用括號() 括起來即可。
ps -ef | grep test
可以看到run.sh的父進程為1,不是當前終端了,這樣就能忽略hung up信號。
當然linux還可以動態(tài)的讓程序后臺運行或不被hung up 信號關閉,例如disown命令,setid命令等。
方法四:
如果是使用Ubuntu的話,你可以利用CTRL+ALT+T組合鍵打開終端。當然你也可以使用超級鍵(Windows鍵)打開Dash,搜索“TERM”,然后點擊“Term”圖標來打開終端窗口。
對于其他的桌面環(huán)境來說,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜單中找到終端。有些環(huán)境會在??繖诨蛘呙姘迳厦姘K端圖標。
通常情況下,你可以在終端里面直接輸入應用程序名來啟動一個應用程序。比如說,你可以通過輸入“firefox”來啟動Firefox。
在終端啟動應用程序的好處是,你可以包含一些額外的參數(shù)。
例如,你可以通過下列命令來打開一個Firefox瀏覽窗口,然后利用默認的搜索引擎搜索相關信息:
firefox -search "linux.cn"
你可能會注意到,如果你啟動Firefox,程序打開以后,回到了終端窗口控制,這就意味著你可以繼續(xù)在終端進行工作。
通常情況下,如果你在終端啟動了應用程序,控制會切換到新啟動的應用程序,只有程序被關閉以后才會重新切換到終端控制。這是因為你在前臺啟動了這個程序。
如果要在Linux終端打開應用程序并且返回終端控制,那么你需要將應用程序啟動為后臺進程。
和下面所列的命令一樣,我們可以通過增加一個()符號,將應用程序在后臺啟動。
libreoffice
譯者注:如果需要加參數(shù)的話,記得把符號放在最后。
譯者注:一般情況下,關閉終端時,在這個終端啟動的后臺程序也會被終止,要使終端關閉以后,后臺程序依然保持執(zhí)行可以使用下列命令
nohup command [arg...]
如果應用程序目錄沒有安裝在PATH變量包含的目錄里面的話,我們就沒有辦法直接通過應用程序名來啟動程序,必須輸入應用程序的整個路徑來啟動它。
/path/to/yourprogram
如果你不確定程序輸入哪個Linux目錄結(jié)構(gòu)的話,可以使用find或者location命令來定位它。
可以輸入下列符號來找到一個文件:
find /path/to/start/from -name programname
例如,你可以輸入下列命令來找到Firefox:
find / -name firefox
命令運行的結(jié)果會嗖的一下輸出一大堆,別擔心,你也可以通過less或者more來進行分頁查看。
find / -name firefox | more find / -name firefox | less
當find命令查找到?jīng)]有權限訪問的文件夾時,會報出一條拒絕訪問錯誤,
你可以通過sudo命令來提示權限。當然,如果你沒有安裝sudo的話,就只能切換到一個擁有權限的用戶了。
sudo find / -name firefox | more
如果你知道你要查找的文件在你的當前目錄結(jié)構(gòu)中,那么你可以使用點來代替斜杠:
sudo find . -name firefox | more
你可能需要sudo來提升權限,也可能根本就不需要,如果這個文件在你的主目錄里面,那么就不需要使用sudo。
有些應用程序則必須要提升權限才能運行,否則你就會得到一大堆拒絕訪問錯誤,除非你使用一個具有權限的用戶或者使用sudo提升權限。
這里有個小竅門。如果你運行了一個程序,但是它需要提升權限來操作,輸入下面命令試試:
sudo !!
方法五:
在Unix/Linux下如果想讓程序獨立終端運行,一般都是使用 在命令結(jié)尾來讓程序自動運行。(命令后可以不追加空格)
打開gnome-terminal,執(zhí)行如下命令:
delectate@delectate:~$ totem [1] 8510delectate@delectate:~$ 有幾點需要注意:
已經(jīng)啟動的程序依然attach于當前pts,只有當前終端模擬器關閉(使用exit命令退出),進程自動被tty繼承。delectate@delectate:~$ ps -e | grep totem //程序已被以totem 形式啟動,當前附在pts0上8819 pts/0 00:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的模擬終端被exit命令關閉,totem自動附在tty8819 ? 00:00:00 totemdelectate@delectate:~$
具有debug輸出的進程,需要按enter鍵進行中斷當前debug輸出。但是如果程序持續(xù)進行printf,你將無法輸入任何命令。delectate@delectate:~$ vlc [1] 8850delectate@delectate:~$ VLC media player 1.0.6 Goldeneye[0x8b998b0] main libvlc: Running vlc with the default interface. Use ‘cvlc’ to use vlc without interface. //enter presseddelectate@delectate:~$ //show a clean terminal now** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL’ failed //仍然在輸出數(shù)據(jù)…… //關閉程序[1]+ Done vlcdelectate@delectate:~$
你無法記錄程序的debug輸出結(jié)果。
只有當虛擬終端是 $ 或者 # 時候,才可以關閉此終端,否則可能導致已經(jīng)啟動的進程被關閉(按enter——如果程序持續(xù)輸出信息而沒有出現(xiàn) $ 或 #)
使用nohup命令:
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中斷/掛起信號,使命令繼續(xù)執(zhí)行)
但是當你嘗試使用命令:
1nohup command
時候卻會遇到不大不小的麻煩……
delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out’
是的,雖然它自動把debug信息記錄到nohup.out文件,但是你卻無法使用這個終端進行任何操作。
所以你需要和第一個方法混用,即
nohupcommand {option}
混用后,它會自動把你執(zhí)行的命令輸出結(jié)果記錄到權限為-rw——-,名為nohup.out的文件中。
但是你仍然需要
delectate@delectate:~$ nohup vlc [1] 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out’ //在這里按一下回車或以ctrl+c以 //show a clean terminal delectate@delectate:~$
與使用 “” 性質(zhì)相同,當前啟動程序的終端如果沒有被關閉,已經(jīng)啟動的程序附在pst上;如果終端被關閉,則自動附在tty。
如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out。默認狀態(tài)下,nohup默認輸出到nohup.out文件,你也可以利用重定向來指定輸出文件:
nohupcommand {option} myout.file 21
只有當虛擬終端是 $ 或者 # 時候,才可以關閉此終端,否則可能導致已經(jīng)啟動的進程被關閉(按enter——如果程序持續(xù)輸出信息而沒有出現(xiàn) $ 或 #)
其他相關命令:
jobs:查看當前有多少在后臺運行的命令
fg:將后臺中的命令調(diào)至前臺繼續(xù)運行。如果后臺中有多個命令,可以用 fg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid)
bg:將一個在后臺暫停的命令,變成繼續(xù)執(zhí)行。如果后臺中有多個命令,可以用bg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid)
殺死進程
殺死已經(jīng)啟動的程序和普通方式一樣:
pkill -9 name
killall name
kill pid
…
命令應用:
linux服務器掛機下載;啟動相關服務;linux服務器啟動進程(尤其是ssh登錄)
我就曾經(jīng)用 1nohup aria2c -i downloadlist -m 0 -j 1
先說pts/0吧,man里面是這樣說的:ptmx
and
pts
-
pseudo-terminal
master
and
slave,pts是所謂的偽終端或虛擬終端,具體表現(xiàn)就是你打開一個終端,這個終端就叫pts/0,如果你再打開一個終端,這個新的終端就叫pts
/1。比如用who命令查詢當前登錄的用戶,可以看到每個用戶的TTY設備(簡單來說就是用戶輸入命令還有顯示信息的設備,比如終端),下面是我機器上的顯示:
calabash
tty7
2009-12-09
20:04
(:0)
calabash
pts/0
2009-12-09
20:20
(:0.0)
calabash
pts/1
2009-12-09
20:27
(:0.0)
有一個tty7是表示圖形界面,我當前登錄的是GNOME,當然就是圖形界面了。還有tty1-tty6表示文字界面,可以用Ctrl+Alt+F1-F6切換,+F7就是切換回圖形界面。下面兩行說明我當前打開了兩個終端窗口,所以就有pts/0和pts/1
再說一下SSH吧,要把本機當做一個遠程SSH服務器用,要先裝個openssh-server,裝完之后會自動啟動sshd服務監(jiān)聽ssh連接,Ubuntu應該是預裝了openssh-client的,所以啟動sshd后,可以自己連接自己,最簡單的命令:ssh
user@localhost
至于Windows下面可以用putty用作ssh連接客戶端。然后突然想起很久以前小龔推薦我注冊的一個unix-
center的賬號可以登錄上面的主機,就是SSH連接的。今天在公司就一直掛在unix-
center的Ubuntu上面,發(fā)現(xiàn)上面登錄的用戶還真不少:
USER
TTY
FROM
LOGIN@
IDLE
JCPU
PCPU
WHAT
k418675
pts/2
202.108.140.161
08:32
3:42
0.08s
0.06s
sshd:
k418675
[
wateran_
pts/3
222.92.112.66
08:41
8:06
0.06s
0.06s
-bash
xiaoshe
pts/4
129.192.196.5
14:17
11:17m
0.08s
0.08s
-bash
lfly
pts/5
211.144.118.166
09:33
0.00s
0.24s
0.06s
sshd:
lfly
[pri
steed.de
pts/6
119.145.41.2
11:58
4:49
0.06s
0.06s
-bash
topojuly
pts/7
218.30.165.69
15:46
10:55m
0.10s
0.10s
-bash
nwpumabi
pts/8
222.92.112.66
15:12
1:35
0.08s
0.08s
-bash
ilylm
pts/9
113.96.216.247
16:26
1:15m
0.08s
0.08s
-bash
niugao
pts/10
:1.0
09:10
7:36
0.06s
0.06s
-bash
niugao
pts/11
:2.0
09:11
7:36
0.08s
0.08s
-bash
cu911
pts/12
221.215.10.154
16:38
0.00s
0.10s
0.02s
vi
./newhead.sh
wendao4
pts/13
113.9.75.218
16:47
3.00s
0.08s
0.08s
-bash
clyet
pts/15
218.247.11.196
14:12
2:07
0.08s
0.02s
sshd:
clyet
[pr
bigarmy
pts/17
124.207.17.24
10:46
4:22m
0.10s
0.10s
-bash
tonylu
pts/16
218.18.214.166
14:19
2:13m
0.08s
0.08s
-bash
nwpumabi
pts/19
222.92.112.66
11:08
5:38
0.08s
0.08s
-bash
vector09
pts/23
:8.0
11:18
5:26
0.38s
0.10s
-bash
vector09
pts/24
:9.0
11:18
5:29
0.08s
0.08s
-bash
vector09
pts/21
:8.0
11:23
5:24
0.08s
0.08s
bash
fishruby
pts/26
118.229.195.133
15:04
1:03
0.08s
0.08s
-bash
jy016492
pts/28
218.17.152.141
15:17
7:56m
0.08s
0.00s
sshd:
jy0164921
xingzj01
pts/29
222.92.112.66
12:46
4:00
0.08s
0.08s
-bash
ls87
pts/30
192.168.1.18
13:39
4:43m
0.20s
0.04s
vim
可以看到有很多pts,就是代表每個用戶用來輸入輸出的終端了
ps 命令的作用是顯示進程信息的;
| 符號,是個管道符號,表示ps 和 grep 命令同時執(zhí)行;
grep 命令是查找(Global Regular Expression Print),能使用正則表達式搜索文本,然后把匹配的行顯示出來;
ps命令有一些參數(shù):
-e : 顯示所有進程
-f : 全格式
-h : 不顯示標題
-l : 長格式
-w : 寬輸出
a :顯示終端上的所有進程,包括其他用戶的進程。
r :只顯示正在運行的進程。
u :以用戶為主的格式來顯示程序狀況。
x :顯示所有程序,不以終端機來區(qū)分。
結(jié)果信息從前到后依次是:
UID PID PPID C STIME TTY TIME CMD
zzw 14124 13991 0 00:38 pts/0 00:00:00 grep –color=auto dae
Linux中的top命令顯示系統(tǒng)上正在運行的進程。它是系統(tǒng)管理員最重要的工具之一。被廣泛用于監(jiān)視服務器的負載。top命令是一個交互命令。在運行top的時候還可以運行很多命令。
N – 以 PID 的大小的順序排列表示進程列表
P – 以 CPU 占用率大小的順序排列進程列表
M – 以內(nèi)存占用率大小的順序排列進程列表
q – 退出 top
h – 幫助
1 系統(tǒng)運行時間和平均負載
這些字段顯示:當前時間、系統(tǒng)已運行的時間、當前登錄用戶的數(shù)量、相應最近5、10和15分鐘內(nèi)的平均負載。
2 任務
第二行顯示的是任務或者進程的總結(jié)。進程可以處于不同的狀態(tài)。這里顯示了全部進程的數(shù)量。除此之外,還有正在運行、睡眠、停止、僵尸進程的數(shù)量(僵尸是一種進程的狀態(tài))。這些進程概括信息可以用’t’切換顯示。
3 CPU 狀態(tài)
下一行顯示的是CPU狀態(tài)。 這里顯示了不同模式下的所占CPU時間的百分比。這些不同的CPU時間表示:
us, user: 運行(未調(diào)整優(yōu)先級的) 用戶進程的CPU時間
sy,system: 運行內(nèi)核進程的CPU時間
ni,niced:運行已調(diào)整優(yōu)先級的用戶進程的CPU時間
wa,IO wait: 用于等待IO完成的CPU時間
hi:處理硬件中斷的CPU時間
si: 處理軟件中斷的CPU時間
st:這個虛擬機被hypervisor偷去的CPU時間(譯注:如果當前處于一個hypervisor下的vm,實際上hypervisor也是要消耗一部分CPU處理時間的)。
4 內(nèi)存使用
接下來兩行顯示內(nèi)存使用率,有點像’free’命令。第一行是物理內(nèi)存使用,第二行是虛擬內(nèi)存使用(交換空間)。
物理內(nèi)存顯示如下:全部可用內(nèi)存、已使用內(nèi)存、空閑內(nèi)存、緩沖內(nèi)存。相似地:交換部分顯示的是:全部、已使用、空閑和緩沖交換空間。
5 各列的意思
PID 進程ID,進程的唯一標識符
USER 進程所有者的實際用戶名。
PR 進程的調(diào)度優(yōu)先級。這個字段的一些值是’rt’。這意味這這些進程運行在實時態(tài)。
NI 進程的nice值(優(yōu)先級)。越小的值意味著越高的優(yōu)先級。
VIRT 進程使用的虛擬內(nèi)存。
RES 駐留內(nèi)存大小。駐留內(nèi)存是任務使用的非交換物理內(nèi)存大小。
SHR SHR是進程使用的共享內(nèi)存。
S 這個是進程的狀態(tài)。它有以下不同的值:
D – 不可中斷的睡眠態(tài)。
R – 運行態(tài)
S – 睡眠態(tài)
T – 被跟蹤或已停止
Z – 僵尸態(tài)
%CPU 自從上一次更新時到現(xiàn)在任務所使用的CPU時間百分比。
%MEM 進程使用的可用物理內(nèi)存百分比。
TIME+ 任務啟動后到現(xiàn)在所使用的全部CPU時間,精確到百分之一秒。
COMMAND 運行進程所使用的命令。
注意 :不同發(fā)行版的top命令在各種細節(jié)有不同,如果發(fā)現(xiàn)不同時,請讀你的幫助手冊和命令內(nèi)的幫助。)
kill、kill-15、kill-9區(qū)別:
執(zhí)行kill(默認kill -15)命令,系統(tǒng)會發(fā)送一個SIGTERM信號給對應的程序,大部分程序接收到SIGTERM信號后,會先釋放自己的資源,然后再停止。用法kill pid。
kill -15 pid。
kill -9命令,系統(tǒng)給對應程序發(fā)送的信號是SIGKILL,即exit。exit信號不會被系統(tǒng)阻塞,所以kill -9能順利殺掉進程。用法kill -9 pid。
tail -n 1000:顯示最后1000行
tail -n +1000:從1000行開始顯示,顯示1000行以后的
head -n 1000:顯示前面1000行
cat a.txt 顯示文件
vim xx.conf 編輯文件
打開文件后,按insert鍵進入編輯模式;編輯完后,按esc建退出編輯模式;按shift+冒號后,輸入wq保存退出,wq!保存強制退出,q不保存退出
在根目錄模糊查找名字含java的文件
服務器端常有很多壓縮過的日志文件,當需要查找日志中某些特定信息的時候,為了避免解壓文件,可以使用zgrep,zcat等命令查找、查看壓縮文件中的信息
zgrep ' 輸入你要查找的東東' /目錄 /文件 .gz 或者.log (當日)
grep ' 輸入你要查找的東東' /目錄 /文件 .gz 或者.log (非當日的壓縮文件)
例如: zgrep 'callMktCamLoad' app.log.2019-12-03-*.gz
rpm包安裝的,可以用 rpm -qa 看到,如果要查找某軟件包是否安裝,用 rpm -qa | grep "軟件或者包的名字"
以deb包安裝的,可以用 dpkg -l 看到。如果是查找指定軟件包,用 dpkg -l | grep "軟件或者包的名字"
yum方法安裝的,可以用 yum list installed 查找,如果是查找指定包,用 yum list installed | grep "軟件名或者包名"
ttyS0~ ttyS3 (串行端口終端)指的是電腦的各個物理接口(這些都是串口,不是并口),外部的終端通過這些物理接口與電腦連接 ,從而實現(xiàn)和電腦進行交互。
?例如:dmesg |grep tty可以查看開啟的接口(串口)
? ? ?目前連接遠程服務器或者直接在服務器上面操作等都是通過創(chuàng)建虛擬終端的形式。比如pts/1 和tty1虛擬終端,其中tty表示直接登錄機器生成的而pts表示遠程連接生成的。其中遠程連接是通過sshd服務進行創(chuàng)建session會話和bash進程(所以可以看到有sshd進程,同時虛擬終端可以創(chuàng)建多個,這是依賴ptmx功能,sshd通過與ptmx通訊,ptmx在和相對應的pts通訊從而達到多個虛擬終端的效果)。
? ? 例如:在centos系統(tǒng)中的圖像界面中打開的terminal就是一個pts但是整個圖形界面是一個tty,centos切換到命令行界面后 輸入tty命令時輸出就是tty1或ttyn了,這時候的命令行界面與圖形界面的運行級別是一樣的,通過命令行創(chuàng)建的所有進程都是屬于tty1終端的。
? ? 注意: tty就是ttyS的虛擬版本,只是不需要通過外部線路進行連接了。遠程連接服務器需要sshd服務,sshd和tty沒有聯(lián)系,遠程連接是因為本地有終端模擬器,本機連接就需要內(nèi)核直接模擬一個模擬器了,所有遠程是pts,本機是tty 。
?從上面的流程中可以看出來對用戶空間的程序來說它們沒有區(qū)別,都是一樣的;從內(nèi)核角度來看pts的另一端連接的是ptmx,而tty的另一端連接的是內(nèi)核的終端模擬器,ptmx和終端模擬器都只是負責維護會話和轉(zhuǎn)發(fā)數(shù)據(jù)包;再看看ptmx和內(nèi)核終端模擬器的另一端,ptmx的另一端連接的是用戶空間的應用程序,如sshd、tmux等,而內(nèi)核終端模擬器的另一端連接的是具體的硬件,如鍵盤和顯示器。
SSH遠程訪問---重點
這里的Terminal可能是任何地方的程序,比如windows上的putty,所以不討論客戶端的Terminal程序是怎么和鍵盤、顯示器交互的。由于Terminal要和ssh服務器打交道,所以肯定要實現(xiàn)ssh的客戶端功能。這里將建立連接和收發(fā)數(shù)據(jù)分兩條線路解釋,為了描述簡潔,這里以sshd代替ssh服務器程序:
建立連接:
1.Terminal請求和sshd建立連接。
2.如果驗證通過,sshd將創(chuàng)建一個新的session。
3.調(diào)用API(posix_openpt())請求ptmx創(chuàng)建一個pts,創(chuàng)建成功后,sshd將得到和ptmx關聯(lián)的fd,并將該fd和session關聯(lián)起來。
4.同時sshd創(chuàng)建shell進程,將新創(chuàng)建的pts和shell綁定。
收發(fā)消息:
1.Terminal收到鍵盤的輸入,Terminal通過ssh協(xié)議將數(shù)據(jù)發(fā)往sshd。
2.sshd收到客戶端的數(shù)據(jù)后,根據(jù)它自己管理的session,找到該客戶端對應的關聯(lián)到ptmx上的fd。
3.往找到的fd上寫入客戶端發(fā)過來的數(shù)據(jù)。
4.ptmx收到數(shù)據(jù)后,根據(jù)fd找到對應的pts(該對應關系由ptmx自動維護),將數(shù)據(jù)包轉(zhuǎn)發(fā)給對應的pts。
5.pts收到數(shù)據(jù)包后,檢查綁定到自己上面的當前前端進程組,將數(shù)據(jù)包發(fā)給該進程組的leader。
6.由于pts上只有shell,所以shell的read函數(shù)就收到了該數(shù)據(jù)包。
7.shell對收到的數(shù)據(jù)包進行處理,然后輸出處理結(jié)果(也可能沒有輸出)。
8.shell通過write函數(shù)將結(jié)果寫入pts。
9.pts將結(jié)果轉(zhuǎn)發(fā)給ptmx。
10.ptmx根據(jù)pts找到對應的fd,往該fd寫入結(jié)果。
11.sshd收到該fd的結(jié)果后,找到對應的session,然后將結(jié)果發(fā)給對應的客戶端。
SSH + Screen/Tmux
? 常用Linux的同學應該對screen和tmux不陌生,通過它們啟動的進程,就算網(wǎng)絡斷開了,也不會受到影響繼續(xù)執(zhí)行,下次連上去時還能看到進程的所有輸出,還能繼續(xù)接著干活。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這種情況要稍微復雜一點,不過原理都是一樣的,前半部分和普通ssh的方式是一樣的,只是pts/0關聯(lián)的前端進程不是shell了,而是變成了tmux客戶端,所以ssh客戶端發(fā)過來的數(shù)據(jù)包都會被tmux客戶端收到,然后由tmux客戶端轉(zhuǎn)發(fā)給tmux服務器,而tmux服務器干的活和ssh的類似,也是維護一堆的session,為每個session創(chuàng)建一個pts,然后將tmux客戶端發(fā)過來的數(shù)據(jù)轉(zhuǎn)發(fā)給相應的pts。由于tmux服務器只和tmux客戶端打交道,和sshd沒有關系,當終端和sshd的連接斷開時,雖然pts/0會被關閉,和它相關的shell和tmux客戶端也將被kill掉,但不會影響tmux服務器,當下次再用tmux客戶端連上tmux服務器時,看到的還是上次的內(nèi)容。
分享文章:包含linux命令開啟pts的詞條
當前鏈接:http://muchs.cn/article8/hcjoip.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站維護、商城網(wǎng)站、微信公眾號、、網(wǎng)站設計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)