A. linux後台執行命令:&和nohup的用法,確實很實用
當我們在終端或控制台工作時,可能不希望由於運行一個作業而佔住了屏幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對於密集訪問磁碟的進程,我們更希望它能夠在每天的非負荷高峰時間段運行(例如凌晨)。為了使這些進程能夠在後台運行,也就是說不在終端屏幕上運行,有幾種選擇方法可供使用。
& :當在前台運行某個作業時,終端被該作業占據;可以在命令後面加上& 實現後台運行。例如:sh test.sh &
適合在後台運行的命令有f i n d、費時的排序及一些s h e l l腳本。在後台運行作業時要當心:需要用戶交互的命令不要放在後台執行,因為這樣你的機器就會在那裡傻等。不過,作業在後台運行一樣會將結果輸出到屏幕上,干擾你的工作。如果放在後台運行的作業會產生大量的輸出,最好使用下面的方法把它的輸出重定向到某個文件中:
這樣,所有的標准輸出和錯誤輸出都將被重定向到一個叫做out.file 的文件中。
PS:當你成功地提交進程以後,就會顯示出一個進程號,可以用它來監控該進程,或殺死它。(ps -ef | grep 進程號 或者 kill -9 進程號)
nohup:使用&命令後,作業被提交到後台運行,當前控制台沒有被佔用,但是一但把當前控制台關掉(退出帳戶時),作業就會停止運行。nohup命令可以在你退出帳戶之後繼續運行相應的進程。nohup就是不掛起的意思( no hang up)。該命令的一般形式為:
如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:
使用了nohup之後,很多人就這樣不管了,其實這樣有可能在當前賬戶非正常退出或者結束的時候,命令還是自己結束了。所以在使用nohup命令後台運行命令之後,需要使用exit正常退出當前賬戶,這樣才能保證命令一直在後台運行。
ctrl + z :可以將一個正在前台執行的命令放到後台,並且處於暫停狀態。
Ctrl+c :終止前台命令。
jobs: 查看當前有多少在後台運行的命令。 jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識。
2>&1解析:
擴展鏈接:如何寫高效的代碼,和代碼優化方法
B. Linux後台進程
引入的原因: 用於控制向多個進程進行信號的分發,發給一個進程組是信號會發生給進程組中每一個進程
會話是一個或者多個進程組的集合,進程調用 setsid 函數建立一個會話。
進程調用setsid函數建立一個新的會話,會發生下面幾件事
守護進程是生存期長的一種進程,沒有控制終端。他們常常在系統引導裝入時啟動,系統關閉是終止。守護進程程序通常以字母 d 結尾。
用戶層的守護進程的父進程是 init 進程。內核的守護進程並非init進程。
以 & 方式運行的為後台進程
比如: ping www..com &
通過 jobs 命令查看
將後台程序放到前台
通過 control+c 命名發送』hupinit『信號kill掉進程
終端被掛斷或者用戶注銷,SIGHUP信號會被發送到該終端相關的控製程序,而SIGHUP的默認行為是終止程序的運行。
需要實現終端退出後進程依然在後台運行,有兩種途徑
如果setid函數的進程就是一個進程組的組長,則函數會返回出錯。為了解決這樣情況,通常函數需要先fork,然後父進程退出,由子進程執行setsid。由於子進程繼承的是父進程的進程組ID,而其PID是新分配的ID,因此這兩者不可能相等,即子進程不可能是進程組的組長。 這種情況下,由於父進程先於子進程退出,因此子進程的父進程會有init進程接管。 而這就是sid命令的實現原理。
設置 setsid www..com
我們對比下和nohup
我們可以看到setsid的父進程變成了init進程。由於會話和父進程和shell無關了,因此無論如何shell都無法向該進程發送SIGHUP命令
C. 4-3 Linux中的會話和作業(1、後台運行 & 和 查看後台 jobs)
一、會話和作業的概念:
1、進程:Linux自身運行的獨立程序。
2、進程組:進程組是一個或多個進程的集合。
_____________________________________________________
Linux包括三種不同類型的進程,每種進程都有自己的特點和屬性:
3、交互進程 —— 由一個shell啟動的進程。交互進程既可以在前台運行,也可以在後台運行。
4、批處理進程 —— 這種進程和終端沒有聯系,是一個進程序列。
5、監控進程(也稱守護進程)—— linux系統啟動時啟動的進程,並在後台運行。
_______________________________________________________________
6、會話:一個用戶登錄終端後會新建一個會話,它是和控制終端產生IO交互的過程。這個過程可以稱之為會話期。會話期可以產生一個 或 多個進程組的集合。(比喻打電話,首先要電話的接通,接通了才可以產生人與人之間的信息交互。在此會話期間可以產生一個或多個不同范疇的話題)
7、作業:作業類似於用戶提交給系統的一個任務。一個作業可以包含一個或多個進程共同完成一個任務。(比喻會議上BOSS需要完成一個任務,根據需求可以分配到一個或多個人配合完成。)
8、作業控制:指的是控制正在運行的進程的行為。比如,用戶可以掛起一個進程,等一會兒再繼續執行該進程。這樣用戶就能在多個獨立作業間進行切換。(比喻正在進行常規工作的員工,經理突發一個事情需要協助處理。這位員工放下手上的工作(掛起)。首先處理經理安排的事情,完事後再處理常規工作的事情。)
二、通過 date 和 sleep 命令理解前台、後台作業。date 命令是顯示系統時間,sleep 命令是設置延時。
1、前台執行命令:
1)、前台執行命令。輸入輸出都是按部就班,執行完一個命令再執行下一個命令,把結果列印出來。
紅色下劃線:date 查看當前日期時間。
黃色下劃線:sleep 10 延時10秒。
藍色下劃線:date 查看當前日期時間。
通過結果可以看出第一個 date 列印出日期時間後,延時10再執行一個 date 列印日期時間。兩個時間相隔 10 秒。
2)、系統正在執行前台的命令時,再輸入命令是不會馬上執行。要執行完畢前面的命令才可以執行後面輸入的命令。同樣用 date 和 sleep做實驗:
紅色下劃線:date 輸出當前日期時間。
黃色下劃線:sleep 60 系統執行延時 60 秒的操作。 [root@localhost ~]# 用戶標識符沒有出現。雖然游標可以進行輸入,但輸入的 ls /tmp/ 命令並沒有馬上執行,沒有輸出。因為此時,前台正在執行 sleep 60 延時60秒的指令。
紅色下劃線:等待 sleep 60 執行完畢後,再執行一個 date 輸出當前日期時間。兩個 date 之間時間相隔 60 秒。
黃色下劃線:待整條 date ; sleep 60 ; date 命令都執行完畢後,再執行剛才延時 60 秒時輸入的 ls /tmp/ 命令,輸出結果。
藍色下劃線:[root@localhost ~]# 用戶標識符出現才算前台命令執行完畢,可以繼續正常操作。
2、後台執行命令:
&:命令後面使用 & 符號,可以讓命令在後台執行。
jobs:可以查看正在後台運行的作業。
jobs選項:-l —— 除了列出作業號外,同時列出 PID。
-r —— 列出僅僅在後台運行的作業。
-s —— 列出僅僅再後台暫停的作業。
1)、後台運行的命令進程不會影響到前台命令進程。
紅色下劃線:sleep 30 & —— 把 sleep 30 丟到後台運行。
黃色下劃線:通過 jobs 命令跟蹤進程情況。(Runing —— 正在運行,Done —— 完成)
綠色下劃線:sleep 後台運行期間進行了 ls 和 tail 命令的查詢輸出,正常運作。
藍色下劃線:jobs 沒有輸出,代表 sleep 已經完結,沒有後台進程。
2)、掛起 和 中斷後台運行的命令。
Ctrl+c:中斷後台進程。Ctrl+z:掛起後台進程。
jobs 命令可以查看到掛起的命令,不可以查看中斷的命令。
3)、jobs選項:-l —— 除了列出作業號外,同時列出 PID。
紅色下劃線:sleep 100 &,後台運行延時100秒的程序。
黃色下劃線:jobs -l 列出所有後台進程(-l —— 含作業號、PID、運行狀態 和 執行的命令。)
運行狀態有 Running 、Stopped 和 Done,後台正在運行會顯示 Running,當運行完畢後用 jobs 查看會顯示 Done,並且命令後面的 & 符號也會消失。Done只出現一次,下次再用 jobs 查看後台程序就沒有了系統曾提示過 Done 的命令。掛起正在運行的命令,後台會顯示 Stopped 暫停狀態。
-r —— 列出僅僅在後台運行的作業。
-s —— 列出僅僅再後台暫停的作業。
D. linux後台任務執行
在命令後面加上&可實現後台運行。使用示例:
但僅使用&命令,當關閉控制台終端時,任務同樣會被終止。
nohup(no hang up)命令,即忽略SIGHUP信號。nohup能保證關閉控制台終端時,任務不被終止:
關閉控制台終端後,通過ps查看,easeapi.sh 的父進程由終端進程變成了init進程,即使關閉終端,任務依然能保持運行。nohup命令默認會在當前目錄創建nohup.out文件存儲輸出信息。如果要輸出到指定文件則:
nohup命令雖然簡單,但在一些情況下可能並不好用。比如,想使用scp命令從需要驗證的服務端下載文件時,直接使用nohup命令並不會出現驗證交互。這種情況下,推薦使用bg/fg命令。
Ctrl + C 和 Ctrl + Z是linux中兩種中斷命令,但作用有不同。Ctrl + C是強制中斷進程,而Ctrl + Z則是暫停任務執行。在終端中正常執行scp命令,輸入賬戶密碼後,使用Ctrl + Z暫停任務。
jobs命令顯示當前任務狀態。
可以看到任務已經暫停,任務編號為1。
bg/fg將可將任務在前後台切換。現在將任務切換到後台:
在通過jobs查看,任務狀態已變成了running:
當關閉終端後,任務可能會被終止。可使用disown命令忽略SIGHUP信號。
E. linux中查看系統當前所有進程的命令是
ps aux為查看系統當前所有進程命令。
工具/原料
VMware Linux 電腦
方法/步驟
1、打開VMware虛擬機,打開終端命令行,通過」su「命令切換到root用戶下。
F. linux後台自動執行命令nohup與日誌查看
在linux上執行腳本,當退出頁面或電腦鎖屏後,腳本就停止執行了。對需要長時間運行的腳本非常不友好。
nohup(no hang up):可以讓程序不掛斷執行。
& :可以讓程序在後台執行。
「> nohup.log」: 表示將日誌輸出到nohup.log文件上。
2>&1:表示將正確日誌、錯誤日誌都輸出到正確日誌指定的文件(nohup.log文件)上。
G. linux系統中掛起操作和強制結束操作(後台運行程序方法)
在linux系統中有這兩個命令 ctrl+z 和ctrl+c ,這兩個命令輸入之後看起來結果差不多,實質是不同的。 他們都有中斷命令的效果,但是作用是不一樣的。 ctrl+c是強制終止程序的執行並結束進程。而ctrl+z則只是中斷任務的執行,但該任務並沒有被結束。 它只是在進程中維持掛起的狀態,用戶可以使用fg/bg命令來繼續前台/後台執行該任務。fg命令會重啟 前台被中斷的任務,bg命令會把中斷的任務放到後台執行。 你也可以使用bg這樣的方法讓一個前台執行的任務切換到後台去執行。 也可以使用fg這樣的方法讓一個後台執行的任務切換到前台去執行。 還有一個最常用的方法是& 在一行命令的最後輸入&,可以讓這行命令放到後台去運行。 使用jobs命令查看當前有多少後台程序在運行。H. 在Linux中,如何設置前、後台命令和程序的執行
命令後直接加&,這個命令就在後台執行;
正在運行的命令,使用Ctrl+z,就掛起;
jobs命令,可以現實後台,包括掛起的命令;
使用bg%作業號就可以把掛起的命令在後台執行;
使用fg%作業號就可以把後台命令調到前台。
I. Linux後台運行python程序
第一種nohup命令來讓程序在後台運行
括弧內容表示可以將平時輸出到控制台中的內容重定向到*.log這個文件中,這個是可選的,如果沒有這個,則會默認輸出到nohup.out文件中。括弧後面你的&表示後台運行。
舉個例子:
第二種方法是寫一個腳本,假設我們定義了一個腳本run.sh
#!/bin/bash 是指此腳本使用/bin/bash來解釋執行下面的語句,其中cd是表示將當前目錄跳到所要運行文件所在目錄,然後python3 文件名.py則表示運行***python文件,當寫完該腳本後,執行以下命令來執行該腳本從而讓程序在後台運行。
通過 ps -ef|grep python3 命令可以查看後台運行的進程都有哪些
J. Linux裡面哪個命令專門查看後台任務
ps命令是用來查看後台進程的