2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

關閉命令行后如何保持程序繼續(xù)運行

 松桃烏羅梵凈山 2020-03-01

在阿里云搭建了一個遠程Jupyter Notebook服務,但是每次關閉了jupyter服務的終端窗口或者ssh自動斷開連接的時候,會將jupyter服務掛斷。

這樣的場景我們經常碰見,折騰了一下,發(fā)現(xiàn)可以使用Linux中nohup命令來守衛(wèi)程序,保證程序不受本地關閉終端窗口/網(wǎng)絡斷開連接的干擾。

在講nohup之前,先介紹一下Linux中前后臺任務的知識。

前臺任務

前臺任務是獨占命令行窗口的任務,只有運行完了或者手動中止該任務,才能執(zhí)行其他命令。比如我們開了一個jupyter notebook, 這個命令行就被獨占了,無法執(zhí)行其他命令,除非關閉了jupyter,命令行才可以輸入其他命令。

后臺任務

與前臺任務相對應,后臺任務在運行的時候,并不需要與用戶交互,它們通常在不打擾用戶其它工作的時候默默地執(zhí)行。使shell可以繼續(xù)響應用戶的輸入。后臺任務繼承當前會話的標準輸出(stdout)和標準錯誤(stderr)。因此,后臺任務的所有輸出依然會同步地在命令行下顯示。不再繼承當前session的標準輸入(stdin),你無法向這個任務輸入指令了。如果它試圖讀取標準輸入,就會暫停執(zhí)行。

可以看出,”后臺任務”與”前臺任務”的本質區(qū)別只有一個:是否繼承標準輸入。

前臺任務切換為后臺任務

·啟動時以后臺任務啟動,只需要在原來的命令后面加上&,啟動的進程就會變?yōu)楹笈_進程。

# root @ WeideMac-Pro in ~ [14:15:51] C:130# 在后臺運行一個Python $ python &[2] 12162
# root @ WeideMac-Pro in ~ [14:15:56] $ Python3.6.1|Anaconda custom (x86_64)| (default, May112017, 13:04:09) [GCC 4.2.1CompatibleApple LLVM 6.0(clang-600.0.57)] on darwinType'help', 'copyright', 'credits'or'license'for more information.
[2] + 12162 suspended (tty output) python
# root @ WeideMac-Pro in ~ [14:15:56] # 這時候發(fā)現(xiàn)命令行可以繼續(xù)執(zhí)行其他命令了,使用fg命令,將最后一個后臺任務切換為前臺任務 $ fg[2] - 12162 continued python>>> print('Hello')Hello>>>

·將正在運行的前臺任務切換為后臺任務,先ctrl+z將前臺程序掛起, 然后執(zhí)行bg命令繼續(xù)運行。

# root @ WeideMac-Pro in ~ [14:20:10] # 在前臺運行一個Python  $ pythonPython3.6.1|Anaconda custom (x86_64)| (default, May112017, 13:04:09) [GCC 4.2.1CompatibleApple LLVM 6.0(clang-600.0.57)] on darwinType'help', 'copyright', 'credits'or'license'for more information.>>> ^Z[1]  + 12248 suspended  python(base) # root @ WeideMac-Pro in ~ [14:20:28] C:146# bg命令,讓后臺任務繼續(xù)執(zhí)行  $ bg[1]  + 12248 continued  python[1]  + 12248 suspended (tty output)  python

將一個程序變?yōu)楹笈_任務并不能達到退出命令行后繼續(xù)運行的效果,這是因為前面的那些前臺和后臺進程都算做是我們打開那個命令行的子進程,如果我們關掉了命令行,系統(tǒng)將向這些子進程發(fā)送一個稱為“SIGHUP”的信號,子進程收到信號后就會關閉。因此,只需要讓子進程忽略SIGHUP信號,就能實現(xiàn)關閉命令行窗口后程序繼續(xù)運行了。

什么是nohup?

nohup 全稱:no hang up(不掛起)??梢詫⒊绦蛞?strong>忽略掛起信號的方式運行起來,被運行的程序的輸出信息將不會顯示到終端

基本用法

nohup Command[ Arg… ] [ & ]

nohup Command [Arg...] [ &] 最后的' &':表示后臺運行,不霸占交互命令行

如果不將 nohup 命令的輸出重定向,輸出將附加到當前目錄的 nohup.out 文件中。

如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。

如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調用。

示例:

nohup jupyter notebook &

運行上面的命令,就會以后臺任務運行jupyter,并且忽略掛起信號,即使關閉了命令行,我們依然可以正常訪問 jupyter notebook。

如何kill后臺任務

既然程序可以放在后臺運行,那我們該如何關掉后臺任務呢?要關閉后臺任務,關鍵是要找到后臺任務的進程ID, 然后通過kill -9 [id]來殺死進程。這里提供兩種方法:

·如果創(chuàng)建任務的終端窗口沒有被關掉,可以使用jobs -l查看進程ID

# root @ WeideMac-Pro in ~ [15:22:22] $ pythonPython3.6.1|Anaconda custom (x86_64)| (default, May112017, 13:04:09) [GCC 4.2.1CompatibleApple LLVM 6.0(clang-600.0.57)] on darwinType'help', 'copyright', 'credits'or'license'for more information.>>> ^Z[1] + 13089 suspended python# root @ WeideMac-Pro in ~ [15:22:34] $ jobs -l[1] + 13089 suspended python# root @ WeideMac-Pro in ~ [15:22:47] $ kill -913089[1] + 13089 killed python

·如果命令行被關掉了,我們jobs命令是找不到我們的后臺任務的,因為每個后臺任務都是和命令行關聯(lián)在一起,這里我們可以使用ps命令:

  # root @ WeideMac-Pro in ~ [15:33:30]   $ python &                         [1] 13434  # root @ WeideMac-Pro in ~ [15:33:39]   $ Python 3.6.1 |Anaconda custom (x86_64)| (default, May 11 2017, 13:04:09)   [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin  Type 'help', 'copyright', 'credits' or 'license' for more information.
[1] + 13434 suspended (tty output) python # root @ WeideMac-Pro in ~ [15:33:39] $ ps -ef|grep python|grep -v grep 501 13434 12860 0 3:33下午 ttys000 0:00.04 python # root @ WeideMac-Pro in ~ [15:33:42] $ kill -9 13434 [1] + 13434 killed python

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多