你得查看后臺存在的進程 #jobs
成都創(chuàng)新互聯(lián)主營維西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應用開發(fā),維西h5小程序設(shè)計搭建,維西網(wǎng)站營銷推廣歡迎維西等地區(qū)企業(yè)咨詢
#fg
#bg
兩個命令是調(diào)入前臺和后臺的命令
在命令后面加上一個
比如:
rm -rf /tmp/
Linux 技巧:讓進程在后臺可靠運行的幾種方法
WeiboGoogle+用電子郵件發(fā)送本頁面
我們經(jīng)常會碰到這樣的問題,用 telnet/ssh 登錄了遠程的 Linux 服務器,運行了一些耗時較長的任務, 結(jié)果卻由于網(wǎng)絡(luò)的不穩(wěn)定導致任務中途失敗。如何讓命令提交后不受本地關(guān)閉終端窗口/網(wǎng)絡(luò)斷開連接的干擾呢?下面舉了一些例子, 您可以針對不同的場景選擇不同的方式來處理這個問題。
nohup/setsid/
場景:
如果只是臨時有一個命令需要長時間運行,什么方法能最簡便的保證它在后臺穩(wěn)定運行呢?
hangup 名稱的來由
在 Unix 的早期版本中,每個終端都會通過 modem 和系統(tǒng)通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發(fā)送 hangup 信號來通知其關(guān)閉所有子進程。
解決方法:
我們知道,當用戶注銷(logout)或者網(wǎng)絡(luò)斷開時,終端會收到 HUP(hangup)信號從而關(guān)閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要么讓進程忽略 HUP 信號,要么讓進程運行在新的會話里從而成為不屬于此終端的子進程。
1. nohup
nohup 無疑是我們首先想到的辦法。顧名思義,nohup 的用途就是讓提交的命令忽略 hangup 信號。讓我們先來看一下 nohup 的幫助信息:
NOHUP(1)??????????????????????? User Commands??????????????????????? NOHUP(1)?NAME???????nohup - run a command immune to hangups, with output to a non-tty?SYNOPSIS???????nohup COMMAND [ARG]...???????nohup OPTION?DESCRIPTION???????Run COMMAND, ignoring hangup signals.????????--help display this help and exit????????--version??????????????output version information and exit
可見,nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可,標準輸出和標準錯誤缺省會被重定向到 nohup.out 文件中。一般我們可在結(jié)尾加上""來將命令同時放入后臺運行,也可用"filename 21"來更改缺省的重定向文件名。
[root@pvcent107 ~]# nohup ping [1] 3059nohup: appending output to `nohup.out'[root@pvcent107 ~]# ps -ef |grep 3059root????? 3059?? 984? 0 21:06 pts/3??? 00:00:00 ping ????? 3067?? 984? 0 21:06 pts/3??? 00:00:00 grep 3059[root@pvcent107 ~]#
2。setsid
nohup 無疑能通過忽略 HUP 信號來使我們的進程避免中途被中斷,但如果我們換個角度思考,如果我們的進程不屬于接受 HUP 信號的終端的子進程,那么自然也就不會受到 HUP 信號的影響了。setsid 就能幫助我們做到這一點。讓我們先來看一下 setsid 的幫助信息:
SETSID(8)???????????????? Linux Programmer’s Manual???????????????? SETSID(8)?NAME???????setsid - run a program in a new session?SYNOPSIS???????setsid program [ arg ... ]?DESCRIPTION???????setsid runs a program in a new session.
可見 setsid 的使用也是非常方便的,也只需在要處理的命令前加上 setsid 即可。
[root@pvcent107 ~]# setsid ping [root@pvcent107 ~]# ps -ef |grep ???? 31094???? 1? 0 07:28 ???????? 00:00:00 ping ???? 31102 29217? 0 07:29 pts/4??? 00:00:00 grep [root@pvcent107 ~]#
值得注意的是,上例中我們的進程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進程 ID),并不是當前終端的進程 ID。請將此例與nohup 例中的父 ID 做比較。
3。
這里還有一個關(guān)于 subshell 的小技巧。我們知道,將一個或多個命名包含在“()”中就能讓這些命令在子 shell 中運行中,從而擴展出很多有趣的功能,我們現(xiàn)在要討論的就是其中之一。
當我們將""也放入“()”內(nèi)之后,我們就會發(fā)現(xiàn)所提交的作業(yè)并不在作業(yè)列表中,也就是說,是無法通過jobs來查看的。讓我們來看看為什么這樣就能躲過 HUP 信號的影響吧。
[root@pvcent107 ~]# (ping )[root@pvcent107 ~]# ps -ef |grep ???? 16270???? 1? 0 14:13 pts/4??? 00:00:00 ping ???? 16278 15362? 0 14:13 pts/4??? 00:00:00 grep [root@pvcent107 ~]#
從上例中可以看出,新提交的進程的父 ID(PPID)為1(init 進程的 PID),并不是當前終端的進程 ID。因此并不屬于當前終端的子進程,從而也就不會受到當前終端的 HUP 信號的影響了。
啟動java后臺進程有兩種方式:
1. 絕對路徑/bin/java() : 后臺運行,你關(guān)掉終端會停止運行
2. nohup 絕對路徑/bin/java (java程序) : 后臺運行,你關(guān)掉終端也會繼續(xù)運行
java相關(guān)操作有:
1.查看java進程信息:
ps -ef | grep java
2.結(jié)束java進程:
kill -9 java程序名稱
命令后直接加,這個命令就在后臺執(zhí)行;
正在運行的命令,使用Ctrl+z,就掛起;
jobs命令,可以現(xiàn)實后臺,包括掛起的命令;
使用bg?%作業(yè)號?就可以把掛起的命令在后臺執(zhí)行;
使用fg??%作業(yè)號?就可以把后臺命令調(diào)到前臺。
引入的原因: 用于控制向多個進程進行信號的分發(fā),發(fā)給一個進程組是信號會發(fā)生給進程組中每一個進程
會話是一個或者多個進程組的集合,進程調(diào)用 setsid 函數(shù)建立一個會話。
進程調(diào)用setsid函數(shù)建立一個新的會話,會發(fā)生下面幾件事
守護進程是生存期長的一種進程,沒有控制終端。他們常常在系統(tǒng)引導裝入時啟動,系統(tǒng)關(guān)閉是終止。守護進程程序通常以字母 d 結(jié)尾。
用戶層的守護進程的父進程是 init 進程。內(nèi)核的守護進程并非init進程。
以 方式運行的為后臺進程
比如: ping
通過 jobs 命令查看
將后臺程序放到前臺
通過 control+c 命名發(fā)送’hupinit‘信號kill掉進程
終端被掛斷或者用戶注銷,SIGHUP信號會被發(fā)送到該終端相關(guān)的控制程序,而SIGHUP的默認行為是終止程序的運行。
需要實現(xiàn)終端退出后進程依然在后臺運行,有兩種途徑
如果setid函數(shù)的進程就是一個進程組的組長,則函數(shù)會返回出錯。為了解決這樣情況,通常函數(shù)需要先fork,然后父進程退出,由子進程執(zhí)行setsid。由于子進程繼承的是父進程的進程組ID,而其PID是新分配的ID,因此這兩者不可能相等,即子進程不可能是進程組的組長。 這種情況下,由于父進程先于子進程退出,因此子進程的父進程會有init進程接管。 而這就是sid命令的實現(xiàn)原理。
設(shè)置 setsid
我們對比下和nohup
我們可以看到setsid的父進程變成了init進程。由于會話和父進程和shell無關(guān)了,因此無論如何shell都無法向該進程發(fā)送SIGHUP命令
搜索nohup
nohup
nohup 命令
用途:LINUX命令用法,不掛斷地運行命令。
語法:nohup Command [ Arg ... ] [ ]
描述:nohup 命令運行由 Command 參數(shù)和任何相關(guān)的 Arg 參數(shù)指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷后使用 nohup 命令運行后臺中的程序。要運行后臺中的 nohup 命令,添加 ( 表示“and”的符號)到命令的尾部。
如果不將 nohup 命令的輸出重定向,輸出將附加到當前目錄的 nohup.out 文件中。如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。如果標準錯誤是一個終端,那么把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的文件描述符。
退出狀態(tài):該命令返回下列出口值:
126 可以查找但不能調(diào)用 Command 參數(shù)指定的命令。
127 nohup 命令發(fā)生錯誤或不能查找由 Command 參數(shù)指定的命令。
否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)。
nohup命令及其輸出文件
nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結(jié)束,那么可以使用nohup命令。該命令可以在你退出帳戶/關(guān)閉終端之后繼續(xù)運行相應的進程。nohup就是不掛起的意思( n ohang up)。
該命令的一般形式為:nohup command
使用nohup命令提交作業(yè)
如果使用nohup命令提交作業(yè),那么在缺省情況下該作業(yè)的所有輸出都被重定向到一個名為 nohup.out的文件中,除非另外指定了輸出文件:
nohup command myout.file 21
在上面的例子中,輸出被重定向到myout.file文件中。
使用 jobs 查看任務。
使用 fg %n 關(guān)閉。
另外有兩個常用的ftp工具ncftpget和ncftpput,可以實現(xiàn)后臺的ftp上傳和下載,這樣我就可以利用這些命令在后臺上傳和下載文件了。
1.nohup
用途:不掛斷地運行命令。
語法:nohup Command [ Arg … ] [ ]
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。
如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。
退出狀態(tài):該命令返回下列出口值:
126 可以查找但不能調(diào)用 Command 參數(shù)指定的命令。
127 nohup 命令發(fā)生錯誤或不能查找由 Command 參數(shù)指定的命令。
否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)。
2.
用途:在后臺運行
一般兩個一起用
nohup command
eg: nohup echo hello logs/hello.log 21