這樣的場景我們經(jīng)常碰見,折騰了一下,,發(fā)現(xiàn)可以使用Linux中 在講 前臺任務(wù) 前臺任務(wù)是獨(dú)占命令行窗口的任務(wù),,只有運(yùn)行完了或者手動中止該任務(wù),才能執(zhí)行其他命令,。比如我們開了一個jupyter notebook, 這個命令行就被獨(dú)占了,,無法執(zhí)行其他命令,除非關(guān)閉了jupyter,,命令行才可以輸入其他命令,。 后臺任務(wù) 與前臺任務(wù)相對應(yīng),后臺任務(wù)在運(yùn)行的時候,,并不需要與用戶交互,,它們通常在不打擾用戶其它工作的時候默默地執(zhí)行。使shell可以繼續(xù)響應(yīng)用戶的輸入,。后臺任務(wù)繼承當(dāng)前會話的標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯誤(stderr),。因此,后臺任務(wù)的所有輸出依然會同步地在命令行下顯示,。不再繼承當(dāng)前session的標(biāo)準(zhǔn)輸入(stdin),,你無法向這個任務(wù)輸入指令了。如果它試圖讀取標(biāo)準(zhǔn)輸入,,就會暫停執(zhí)行,。 可以看出,”后臺任務(wù)”與”前臺任務(wù)”的本質(zhì)區(qū)別只有一個:是否繼承標(biāo)準(zhǔn)輸入,。 前臺任務(wù)切換為后臺任務(wù)·啟動時以后臺任務(wù)啟動,,只需要在原來的命令后面加上 # root @ WeideMac-Pro in ~ [14:15:51] C:130 # 在后臺運(yùn)行一個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 darwin Type'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命令,將最后一個后臺任務(wù)切換為前臺任務(wù) $ fg [2] - 12162 continued python >>> print('Hello') Hello >>> ·將正在運(yùn)行的前臺任務(wù)切換為后臺任務(wù),,先ctrl+z將前臺程序掛起, 然后執(zhí)行
將一個程序變?yōu)楹笈_任務(wù)并不能達(dá)到退出命令行后繼續(xù)運(yùn)行的效果,,這是因?yàn)榍懊娴哪切┣芭_和后臺進(jìn)程都算做是我們打開那個命令行的子進(jìn)程,,如果我們關(guān)掉了命令行,系統(tǒng)將向這些子進(jìn)程發(fā)送一個稱為“SIGHUP”的信號,,子進(jìn)程收到信號后就會關(guān)閉,。因此,只需要讓子進(jìn)程忽略SIGHUP信號,,就能實(shí)現(xiàn)關(guān)閉命令行窗口后程序繼續(xù)運(yùn)行了,。 什么是nohup,?nohup 全稱:no hang up(不掛起)??梢詫⒊绦蛞?strong>忽略掛起信號的方式運(yùn)行起來,,被運(yùn)行的程序的輸出信息將不會顯示到終端 基本用法nohup Command[ Arg… ] [ & ] nohup Command [Arg...] [ &] 最后的' &':表示后臺運(yùn)行,不霸占交互命令行 如果不將 nohup 命令的輸出重定向,,輸出將附加到當(dāng)前目錄的 nohup.out 文件中,。 如果當(dāng)前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中,。 如果沒有文件能創(chuàng)建或打開以用于追加,,那么 Command 參數(shù)指定的命令不可調(diào)用。 示例:
運(yùn)行上面的命令,,就會以后臺任務(wù)運(yùn)行jupyter,并且忽略掛起信號,,即使關(guān)閉了命令行,我們依然可以正常訪問 jupyter notebook,。 如何kill后臺任務(wù)既然程序可以放在后臺運(yùn)行,,那我們該如何關(guān)掉后臺任務(wù)呢?要關(guān)閉后臺任務(wù),,關(guān)鍵是要找到后臺任務(wù)的進(jìn)程ID, 然后通過 ·如果創(chuàng)建任務(wù)的終端窗口沒有被關(guān)掉,可以使用 # root @ WeideMac-Pro in ~ [15:22:22] $ python Python3.6.1|Anaconda custom (x86_64)| (default, May112017, 13:04:09) [GCC 4.2.1CompatibleApple LLVM 6.0(clang-600.0.57)] on darwin Type'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 ·如果命令行被關(guān)掉了,,我們
|
|