關閉命令行或者xshell窗口后后台依舊執行命令


有時候我們會遇到使用scp拷貝文件很大,或者網速不夠的情況,就需要很長時間,不能一直開着xshell窗口一直等待,那如何使scp可以在xshell關閉了依舊可以執行呢?

一、前台/后台執行

在日常工作中我們多數情況下還是會使用第三方工具去連接服務器,例如我使用的是xshell,很少會直接去機房登錄服務器。在我的理解中,我們使用xshell連接服務器,每一的連接就等於打開了一個shell窗口,即使用相同的用戶多次連接服務器,也是等於打開了多個shell窗口,這里所說的前台/后台執行都是在此shell窗口的基礎上,即如果當前的shell窗口關閉了,那即使是在當前shell窗口下的后台執行的任務也會斷開

1、ctrl+z 、ctrl+c、 ctrl+d

  • ctrl+c 是強制中斷程序的執行,進程已經終止

  • ctrl+z 是將任務中止(暫停的意思),但是此任務並沒有結束,他仍然在進程中他只是維持掛起的狀態,用戶可以使用 fg/bg 操作繼續前台或后台的任務。

    • fg 命令重新啟動前台被中斷的任務;
    • bg 命令把被中斷的任務放在后台執行。

    [TIP]
    (1) Ctrl+Z 掛起進程並放入后台
    (2) jobs 顯示當前暫停的進程,后面接參數 -l 可以顯示pid和狀態信號
    (3) bg %N 使第N個任務在后台運行(%前有空格)
    (4) fg %N 使第N個任務在前台運行
    默認 bg/fg 不帶%N時表示對最后一個進程操作

  • ctrl-d 不是發送信號,而是表示一個特殊的二進制值,表示 EOF。

2、nohup和&的使用

  • nohup,不掛斷地運行命令,默認輸出到nohup.out文件中
  • &,在后台執行
  • 一般是結合使用,常用格式如:nohup command >> /tmp/output.log 2>&1 &

3、使用

在只打開一個shell窗口的前提下,我們可以用上述的兩種方式將scp命令放到后台進行,這樣在這窗口中可以繼續做其他的操作,切記不要關閉此窗口。(實際工作中,可能更多的是重新打開一個xshell窗口去操作其他命令。)

二、screen命令的使用

1、簡介

如果要求關閉xshell窗口,怎么讓scp可以繼續在服務器上執行呢?我們需要使用一個工具---Screen。Screen是一款由GNU計划開發的用於命令行終端切換的自由軟件。用戶可以通過該軟件同時連接多個本地或遠程的命令行會話,並在其間自由切換。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。在Screen環境下,所有的會話都獨立的運行,並擁有各自的編號、輸入、輸出和窗口緩存。用戶可以通過快捷鍵在不同的窗口下切換,並可以自由的重定向各個窗口的輸入和輸出。

2、下載

yum install -y screen

3、語法

$> screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s ][-S <作業名稱>]

  • -A  將所有的視窗都調整為目前終端機的大小。
  • -d <作業名稱>  將指定的screen作業離線。
  • -h <行數>  指定視窗的緩沖區行數。
  • -m  即使目前已在作業中的screen作業,仍強制建立新的screen作業。
  • -r <作業名稱>  恢復離線的screen作業。
  • -R  先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
  • -s  指定建立新視窗時,所要執行的shell。
  • -S <作業名稱>  指定screen作業的名稱。
  • -v  顯示版本信息。
  • -x  恢復之前離線的screen作業。
  • -ls或--list  顯示目前所有的screen作業。
  • -wipe  檢查目前所有的screen作業,並刪除已經無法使用的screen作業。

4、常用參數

  • screen -S yourname -> 新建一個叫yourname的session
  • screen -ls -> 列出當前所有的session
  • screen -r yourname -> 回到yourname這個session
  • screen -d yourname -> 遠程detach某個session
  • screen -d -r yourname -> 結束當前session並回到yourname這個session

5、在session下,使用ctrl+a

  • C-a ? -> 顯示所有鍵綁定信息
  • C-a c -> 創建一個新的運行shell的窗口並切換到該窗口
  • C-a n -> Next,切換到下一個 window
  • C-a p -> Previous,切換到前一個 window
  • C-a 0..9 -> 切換到第 0..9 個 window
  • Ctrl+a [Space] -> 由視窗0循序切換到視窗9
  • C-a C-a -> 在兩個最近使用的 window 間切換
  • C-a x -> 鎖住當前的 window,需用用戶密碼解鎖
  • C-a d -> detach,暫時離開當前session,將目前的 screen session (可能含有多個 windows) 丟到后台執行,並會回到還沒進 screen 時的狀態,此時在 screen session 里,每個 window 內運行的 process (無論是前台/后台)都在繼續執行,即使 logout 也不影響。
  • C-a z -> 把當前session放到后台執行,用 shell 的 fg 命令則可回去。
  • C-a w -> 顯示所有窗口列表
  • C-a t -> time,顯示當前時間,和系統的 load
  • C-a k -> kill window,強行關閉當前的 window
  • C-a [ -> 進入 copy mode,在 copy mode 下可以回滾、搜索、復制就像用使用 vi 一樣
    • C-b Backward,PageUp
    • C-f Forward,PageDown
    • H(大寫) High,將光標移至左上角
    • L Low,將光標移至左下角
    • 0 移到行首
    • $ 行末
    • w forward one word,以字為單位往前移
    • b backward one word,以字為單位往后移
    • Space 第一次按為標記區起點,第二次按為終點
    • Esc 結束 copy mode
  • C-a ] -> paste,把剛剛在 copy mode 選定的內容貼上

6、實際使用

已經安裝好了screen,現在要求即使退出了xshell窗口依然可以在服務器上執行scp命令。

  • 創建screen會話
    screen -S wordname "wordname"自己定義,例如就用scp

  • 輸入要運行程序的命令
    創建好會話后,就可以輸入我們正常的scp命令,進行文件傳輸

  • 關閉會話窗口
    Crtl+a+d 即暫時離開session,窗口會放到后台去執行,這時候即使關閉了xshell窗口也會依然執行

  • 重新打開screen會話窗口查看程序或命令執行情況
    screen -r wordname


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM