導航:首頁 > 程序命令 > linuxnohup命令

linuxnohup命令

發布時間:2022-08-27 12:00:25

linux 怎麼查看nohup進程

在linux操作系統中從後台一直運行某個程序的方法,就是使用nohup命令了。

Unix/Linux下一般比如想讓某個程序在後台運行,很多都是使用 & 在程序結尾來讓程序自動運行。

比如要運行mysql在後台:

復制代碼
代碼如下:

/usr/local/mysql/bin/mysqld_safe
–user=mysql &

但是加入很多程序並不象mysqld一樣做成守護進程,可能程序只是普通程序而已,一般這種程序使用 &
結尾,但是如果終端關閉,那麼程序也會被關閉。
為了能夠後台運行,可以使用nohup這個命令,比如有個test.php需要在後台運行,並且希望在後台能夠定期運行,那麼就使用nohup:

復制代碼
代碼如下:

nohup /root/test.php &

在shell中回車後提示:

[~]$ appending output to nohup.out

原程序的的標准輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用。

但是有時候在這一步會有問題,當把終端關閉後,進程會自動被關閉,查看nohup.out可

以看到在關閉終端瞬間服務自動關閉。

咨詢紅旗Linux工程師後,他也不得其解,在我的終端上執行後,他啟動的進程竟然在關閉終端後依然運行。在第二遍給我演示時,我才發現我和他操作終端時的一個細節不同:他是在當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到shell輸入命令窗口,然後通過在shell中輸入exit來退出終端;而我是每次在nohup執行成功後直接點關閉程序按鈕關閉終端.。所以這時候會斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起shutdown。這個細節有人和我一樣沒注意到,所以在這兒記錄一下了。

附:nohup命令參考

nohup 命令

用途:不掛斷地運行命令。

語法:nohup Command [ Arg … ] [& ]

描述:nohup 命令運行由 Command 參數和任何相關的 Arg 參數指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷後使用 nohup
命令運行後台中的程序。要運行後台中的 nohup 命令,添加 & ( 表示」and」的符號)到命令的尾部。

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。如果當前目錄的 nohup.out
文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。如果沒有文件能創建或打開以用於追加,那麼 Command
參數指定的命令不可調用。如果標准錯誤是一個終端,那麼把指定的命令寫給標准錯誤的所有輸出作為標准輸出重定向到相同的文件描述符。

退出狀態:該命令返回下列出口值:

126 可以查找但不能調用 Command 參數指定的命令。

127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。

否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。

nohup命令及其輸出文件

nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。nohup就是不掛起的意思(
no hang up)。

該命令的一般形式為:

復制代碼
代碼如下:

nohup command &

使用nohup命令提交作業

如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:

復制代碼
代碼如下:

nohup command > myout.file 2>&1
&

在上面的例子中,輸出被重定向到myout.file文件中。

使用 jobs 查看任務。

使用 fg
%jobnumber是將任務拿到前台執行,拿到前台後如果要關閉這個任務按Ctrl+c組合鍵即可,但如果要暫停這個任務可以按Ctrl+z組合鍵這時就會將任務置於暫停狀態。

[root@wangdm ~ 22:51 #81]# jobs
[2]+ Stopped dd
if=/dev/zero of=/dev/null bs=8k count=100000000
[3]- Stopped
dd if=/dev/zero of=/dev/null bs=8k count=100000000

如果想要暫停的任務繼續在後執行可以使用 bg %jobnumber這樣暫停後的任務繼續在後台運行狀態會變為running

Ⅱ nohup命令的用法

nohup命令的用法在應用Unix/linux時,我們一般想讓某個程序在後台運行,於是我們將常會用
&
在程序結尾來讓程序自動運行。比如我們要運行mysql在後台:
/usr/local/mysql/bin/mysqld_safe
–user=mysql
&。可是有很多程序並不想mysqld一樣,這樣我們就需要nohup命令,怎樣使用nohup命令呢?這里講解nohup命令的一些用法。nohup
/root/start.sh
&在shell中回車後提示:[~]$
appending
output
to
nohup.out原程序的的標准輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用。但是有時候在這一步會有問題,當把終端關閉後,進程會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。咨詢紅旗linux工程師後,他也不得其解,在我的終端上執行後,他啟動的進程竟然在關閉終端後依然運行。在第二遍給我演示時,我才發現我和他操作終端時的一個細節不同:他是在當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到shell輸入命令窗口,然後通過在shell中輸入exit來退出終端;而我是每次在nohup執行成功後直接點關閉程序按鈕關閉終端.。所以這時候會斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起shutdown。這個細節有人和我一樣沒注意到,所以在這兒記錄一下了。附:nohup命令參考nohup
命令用途:不掛斷地運行命令。語法:nohup
Command
[
Arg
]
[&
]描述:nohup
命令運行由
Command
參數和任何相關的
Arg
參數指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷後使用
nohup
命令運行後台中的程序。要運行後台中的
nohup
命令,添加
&

表示and的符號)到命令的尾部。無論是否將
nohup
命令的輸出重定向到終端,輸出都將附加到當前目錄的
nohup.out
文件中。如果當前目錄的
nohup.out
文件不可寫,輸出重定向到
$HOME/nohup.out
文件中。如果沒有文件能創建或打開以用於追加,那麼
Command
參數指定的命令不可調用。如果標准錯誤是一個終端,那麼把指定的命令寫給標准錯誤的所有輸出作為標准輸出重定向到相同的文件描述符。退出狀態:該命令返回下列出口值:126
可以查找但不能調用
Command
參數指定的命令。127
nohup
命令發生錯誤或不能查找由
Command
參數指定的命令。否則,nohup
命令的退出狀態是
Command
參數指定命令的退出狀態。nohup命令及其輸出文件nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。nohup就是不掛起的意思(
n
ohang
up)。該命令的一般形式為:nohup
command
&使用nohup命令提交作業如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:nohup
command
>
myout.file
2>&1
&在上面的例子中,輸出被重定向到myout.file文件中。

Ⅲ linux運行nohup,沒有這個命令怎麼辦

在應用Unix/Linux時,我們一般想讓某個程序在後台運行,於是我們將常會
用 在程序結尾來讓程序自動運行。比如我們要運行mysql在後台: /usr/local/mysql/bin/mysqld_safe
–user=mysql
。可是有很多程序並不想mysqld一樣,這樣我們就需要nohup命令,怎樣使用nohup命令呢?這里講解nohup命令的一些用法。
nohup /root/start.sh
在shell中回車後提示:
[~]$ appending output to nohup.out
原程序的的標准輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用。
但是有時候在這一步會有問題,當把終端關閉後,進程會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。

Ⅳ linux 系統中 nohup命令如何使用

linux的nohup命令的用法。

在應用Unix/Linux時,我們一般想讓某個程序在後台運行,於是我們將常會
用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在後台: /usr/local/mysql/bin/mysqld_safe
–user=mysql
&。可是有很多程序並不想mysqld一樣,這樣我們就需要nohup命令,怎樣使用nohup命令呢?這里講解nohup命令的一些用法。
nohup /root/start.sh &
在shell中回車後提示:
[~]$ appending output to nohup.out
原程序的的標准輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用。
但是有時候在這一步會有問題,當把終端關閉後,進程會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。
咨詢紅旗Linux工程師後,他也不得其解,在我的終端上執行後,他啟動的進程竟然在關閉終端後依然運行。
在第二遍給我演示時,我才發現我和他操作終端時的一個細節不同:他是在當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到
shell輸入命令窗口,然後通過在shell中輸入exit來退出終端;而我是每次在nohup執行成功後直接點關閉程序按鈕關閉終端.。所以這時候會
斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起shutdown。
這個細節有人和我一樣沒注意到,所以在這兒記錄一下了。
附:nohup命令參考
nohup 命令
用途:不掛斷地運行命令。
語法:nohup Command [ Arg … ] [& ]
描述:nohup 命令運行由 Command 參數和任何相關的 Arg 參數指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷後使用
nohup 命令運行後台中的程序。要運行後台中的 nohup 命令,添加 & ( 表示」and」的符號)到命令的尾部。
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。如果當前目錄的 nohup.out
文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。如果沒有文件能創建或打開以用於追加,那麼 Command
參數指定的命令不可調用。如果標准錯誤是一個終端,那麼把指定的命令寫給標准錯誤的所有輸出作為標准輸出重定向到相同的文件描述符。
退出狀態:該命令返回下列出口值:
126 可以查找但不能調用 Command 參數指定的命令。
127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。
否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。
nohup命令及其輸出文件
nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。nohup就是不掛起的意思( n ohang up)。
該命令的一般形式為:nohup command &
使用nohup命令提交作業
如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的文件中,除非另外指定了輸出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,輸出被重定向到myout.file文件中。
使用 jobs 查看任務。
使用 fg %n關閉。

Ⅳ linux命令nohup和screen命令的區別

nohup讓程序在後台繼續運行
常用命令:nohup ./test.sh & 【如果運行成功則默認會將標准輸出重定向到當前目錄的nohup.out文件中,當然可以自己重定向輸出信息】
當需要將nohup後台運行的程序調到前台時,先jobs命令查看後台job編號,用 fg %n命令可以調回到前台運行(n是job的編號)。
PS:單獨的&時可以讓命令後台運行的,知識如果ssh會話斷掉,&的命令也會自動退出。

screen讓程序後台執行--一個強大的工具
簡 單來說,Screen是一個可以在多個進程之間多路復用一個物理終端的窗口管理器。Screen中有會話的概念,用戶可以在一個screen會話中創建多 個screen窗口,在每一個screen窗口中就像操作一個真實的telnet/SSH連接窗口那樣。

Ⅵ linux怎麼查詢nohup的進程

在linux操作系統中從後台一直運行某個程序的方法,就是使用nohup命令了。Unix/Linux下一般比如想讓某個程序在後台運行,很多都是使用在程序結尾來讓程序自動運行。以下是查詢方法。

Ⅶ linux命令裡面 nohup命令和 & 是不是一個意思啊,不掛斷是什麼意思。

nohup/setsid/&
場景:
如果只是臨時有一個命令需要長時間運行,什麼方法能最簡便的保證它在後台穩定運行呢?

hangup 名稱的來由
在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發送 hangup 信號來通知其關閉所有子進程。
解決方法:
我們知道,當用戶注銷(logout)或者網路斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要麼讓進程忽略 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 文件中。一般我們可在結尾加上"&"來將命令同時放入後台運行,也可用">filename 2>&1"來更改預設的重定向文件名。
nohup 示例
[root@pvcent107 ~]# nohup ping www.ibm.com &
[1] 3059
nohup: appending output to `nohup.out'
[root@pvcent107 ~]# ps -ef |grep 3059
root 3059 984 0 21:06 pts/3 00:00:00 ping www.ibm.com
root 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 即可。
setsid 示例
[root@pvcent107 ~]# setsid ping www.ibm.com
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com
root 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com
[root@pvcent107 ~]#

值得注意的是,上例中我們的進程 ID(PID)為31094,而它的父 ID(PPID)為1(即為 init 進程 ID),並不是當前終端的進程 ID。請將此例與nohup 例中的父 ID 做比較。
3。&
這里還有一個關於 subshell 的小技巧。我們知道,將一個或多個命名包含在「()」中就能讓這些命令在子 shell 中運行中,從而擴展出很多有趣的功能,我們現在要討論的就是其中之一。
當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來查看的。讓我們來看看為什麼這樣就能躲過 HUP 信號的影響吧。
subshell 示例
[root@pvcent107 ~]# (ping www.ibm.com &)
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root 16270 1 0 14:13 pts/4 00:00:00 ping www.ibm.com
root 16278 15362 0 14:13 pts/4 00:00:00 grep www.ibm.com
[root@pvcent107 ~]#

從上例中可以看出,新提交的進程的父 ID(PPID)為1(init 進程的 PID),並不是當前終端的進程 ID。因此並不屬於當前終端的子進程,從而也就不會受到當前終端的 HUP 信號的影響了。
回頁首
disown
場景:
我們已經知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 HUP 信號的影響呢?

解決方法:
這時想加 nohup 或者 setsid 已經為時已晚,只能通過作業調度和 disown 來解決這個問題了。讓我們來看一下 disown 的幫助信息:

disown [-ar] [-h] [jobspec ...]
Without options, each jobspec is removed from the table of
active jobs. If the -h option is given, each jobspec is not
removed from the table, but is marked so that SIGHUP is not
sent to the job if the shell receives a SIGHUP. If no jobspec
is present, and neither the -a nor the -r option is supplied,
the current job is used. If no jobspec is supplied, the -a
option means to remove or mark all jobs; the -r option without
a jobspec argument restricts operation to running jobs. The
return value is 0 unless a jobspec does not specify a valid
job.

可以看出,我們可以用如下方式來達成我們的目的。
靈活運用 CTRL-z

我們的日常工作中,我們可以用 CTRL-z 來將當前進程掛起到後台暫停運行,執行一些別的操作,然後再用 fg 來將掛起的進程重新放回前台(也可用
bg
來將掛起的進程放在後台)繼續運行。這樣我們就可以在一個終端內靈活切換運行多個任務,這一點在調試代碼時尤為有用。因為將代碼編輯器掛起到後台再重新放
回時,游標定位仍然停留在上次掛起時的位置,避免了重新定位的麻煩。
用disown -h jobspec來使某個作業忽略HUP信號。
用disown -ah 來使所有的作業都忽略HUP信號。
用disown -rh 來使正在運行的作業忽略HUP信號。
需要注意的是,當使用過 disown 之後,會將把目標作業從作業列表中移除,我們將不能再使用jobs來查看它,但是依然能夠用ps -ef查找到它。
但是還有一個問題,這種方法的操作對象是作業,如果我們在運行命令時在結尾加了"&"來使它成為一個作業並在後台運行,那麼就萬事大吉了,我們可以通過jobs命令來得到所有作業的列表。但是如果並沒有把當前命令作為作業來運行,如何才能得到它的作業號呢?答案就是用 CTRL-z(按住Ctrl鍵的同時按住z鍵)了!
CTRL-z 的用途就是將當前進程掛起(Suspend),然後我們就可以用jobs命令來查詢它的作業號,再用bg jobspec來將它放入後台並繼續運行。需要注意的是,如果掛起會影響當前進程的運行結果,請慎用此方法。
disown 示例1(如果提交命令時已經用「&」將命令放入後台運行,則可以直接使用「disown」)
[root@pvcent107 build]# cp -r testLargeFile largeFile &
[1] 4825
[root@pvcent107 build]# jobs
[1]+ Running cp -i -r testLargeFile largeFile &
[root@pvcent107 build]# disown -h %1
[root@pvcent107 build]# ps -ef |grep largeFile
root 4825 968 1 09:46 pts/4 00:00:00 cp -i -r testLargeFile largeFile
root 4853 968 0 09:46 pts/4 00:00:00 grep largeFile
[root@pvcent107 build]# logout

disown 示例2(如果提交命令時未使用「&」將命令放入後台運行,可使用 CTRL-z 和「bg」將其放入後台,再使用「disown」)
[root@pvcent107 build]# cp -r testLargeFile largeFile2

[1]+ Stopped cp -i -r testLargeFile largeFile2
[root@pvcent107 build]# bg %1
[1]+ cp -i -r testLargeFile largeFile2 &
[root@pvcent107 build]# jobs
[1]+ Running cp -i -r testLargeFile largeFile2 &
[root@pvcent107 build]# disown -h %1
[root@pvcent107 build]# ps -ef |grep largeFile2
root 5790 5577 1 10:04 pts/3 00:00:00 cp -i -r testLargeFile largeFile2
root 5824 5577 0 10:05 pts/3 00:00:00 grep largeFile2
[root@pvcent107 build]#

回頁首
screen
場景:
我們已經知道了如何讓進程免受 HUP 信號的影響,但是如果有大量這種命令需要在穩定的後台里運行,如何避免對每條命令都做這樣的操作呢?

解決方法:
此時最方便的方法就是 screen
了。簡單的說,screen 提供了 ANSI/VT100 的終端模擬器,使它能夠在一個真實終端下運行多個全屏的偽終端。screen
的參數很多,具有很強大的功能,我們在此僅介紹其常用功能以及簡要分析一下為什麼使用 screen 能夠避免 HUP 信號的影響。我們先看一下
screen 的幫助信息:
SCREEN(1) SCREEN(1)

NAME
screen - screen manager with VT100/ANSI terminal emulation

SYNOPSIS
screen [ -options ] [ cmd [ args ] ]
screen -r [[pid.]tty[.host]]
screen -r sessionowner/[[pid.]tty[.host]]

DESCRIPTION
Screen is a full-screen window manager that multiplexes a physical
terminal between several processes (typically interactive shells).
Each virtual terminal provides the functions of a DEC VT100 terminal
and, in addition, several control functions from the ISO 6429 (ECMA
48, ANSI X3.64) and ISO 2022 standards (e.g. insert/delete line and
support for multiple character sets). There is a scrollback history
buffer for each virtual terminal and a -and-paste mechanism that
allows moving text regions between windows.

使用 screen 很方便,有以下幾個常用選項:
用screen -dmS session name來建立一個處於斷開模式下的會話(並指定其會話名)。
用screen -list 來列出所有會話。
用screen -r session name來重新連接指定會話。
用快捷鍵CTRL-a d 來暫時斷開當前會話。
screen 示例
[root@pvcent107 ~]# screen -dmS Urumchi
[root@pvcent107 ~]# screen -list
There is a screen on:
12842.Urumchi (Detached)
1 Socket in /tmp/screens/S-root.

[root@pvcent107 ~]# screen -r Urumchi

當我們用「-r」連接到 screen 會話後,我們就可以在這個偽終端裡面為所欲為,再也不用擔心 HUP 信號會對我們的進程造成影響,也不用給每個命令前都加上「nohup」或者「setsid」了。這是為什麼呢?讓我來看一下下面兩個例子吧。
1. 未使用 screen 時新進程的進程樹
[root@pvcent107 ~]# ping www.google.com &
[1] 9499
[root@pvcent107 ~]# pstree -H 9499
init─┬─Xvnc
├─acpid
├─atd
├─2*[sendmail]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash───ping

我們可以看出,未使用 screen 時我們所處的 bash 是 sshd 的子進程,當 ssh 斷開連接時,HUP 信號自然會影響到它下面的所有子進程(包括我們新建立的 ping 進程)。
2. 使用了 screen 後新進程的進程樹
[root@pvcent107 ~]# screen -r Urumchi
[root@pvcent107 ~]# ping www.ibm.com &
[1] 9488
[root@pvcent107 ~]# pstree -H 9488
init─┬─Xvnc
├─acpid
├─atd
├─screen───bash───ping
├─2*[sendmail]

而使用了 screen 後就不同了,此時 bash 是 screen 的子進程,而 screen 是 init(PID為1)的子進程。那麼當 ssh 斷開連接時,HUP 信號自然不會影響到 screen 下面的子進程了。

Ⅷ linux如何設置程序開機啟動後台運行

有些時候,我們需要在終端啟動一個程序,並使之運行——但是如果關閉終端,那麼這個程序也就隨著關閉了。那麼有沒有什麼方法在關閉終端後,讓已經從這個終端啟動的程序繼續運行呢?有以下方法

1.讓linux忽略終端的hung up 信號,不關閉進程;

2.讓此進程變為終端的非子進程。

方法一:

在終端輸入命令:

# ./pso > pso.file 2>&1 &

解釋:將pso直接放在後台運行,並把終端輸出存放在當前目錄下的pso.file文件中。

當客戶端關機後重新登陸伺服器後,直接查看pso.file文件就可看執行結果(命

令:#cat pso.file )。

或者 在終端輸入命令:

# nohup ./pso > pso.file 2>&1 &

解釋:nohup就是不掛起的意思,將pso直接放在後台運行,並把終端輸出存放在當前

目錄下的pso.file文件中。當客戶端關機後重新登陸伺服器後,直接查看pso.file

文件就可看執行結果(命令:#cat pso.file )。

方法二:

實現方案就是nohup命令。

例如要啟動jboss,可以nohup ./run.sh &。這樣就可以了,結尾的「&」符號表示後台啟動jboss,從而不影響繼續運行其他命令。

但這樣有一個問題,nohup命令雖然可以讓linux「放過」這個進程,但是nohup會同時把進程的控制台輸出重定向到nohup.txt下(默認是這個文件),當然可以重定向為其他的文件,但是輸出總會有的。

如果jboss運行很長時間,而且如果有很多控制台輸出的話,nohup.txt文件就會變的很大很大。

通常項目中的日誌都會輸出到特定的日誌文件或者輸出到 資料庫 中,也就是說控制台的輸出對於程序的意義不大,那麼可不可以拋棄掉這些輸出呢?答案是肯定的。

這里講解一下linux的重定向(注意,是linux的重定向,不是針對nohup)。

0、1和2分別表示標准輸入、標准輸出和標准錯誤信息輸出,可以用來指定需要重定向的標准輸入或輸出。

在一般使用時,默認的是標准輸出,既1.當我們需要特殊用途時,可以使用其他標號。例如,將某個程序的錯誤信息輸出到log文件中:./program 2>log。這樣標准輸出還是在屏幕上,但是錯誤信息會輸出到log文件中。

另外,也可以實現0,1,2之間的重定向。2>&1:將錯誤信息重定向到標准輸出。

Linux下還有一個特殊的文件/dev/null,它就像一個無底洞,所有重定向到它的信息都會消失得無影無蹤。

結合nohup,我們可以這樣 nohup ./run.sh >/dev/null &

這是最簡單的一種方式,既保證了程序能夠一直後台執行,又能保證不會產生太大的nohup.txt文件。

方法三:

利用的linux的一個機制,讓程序在subshell中執行,方法很簡單,將命令用括弧() 括起來即可。

ps -ef | grep test

可以看到run.sh的父進程為1,不是當前終端了,這樣就能忽略hung up信號。

當然linux還可以動態的讓程序後台運行或不被hung up 信號關閉,例如disown命令,setid命令等。


方法四:

如果是使用Ubuntu的話,你可以利用CTRL+ALT+T組合鍵打開終端。當然你也可以使用超級鍵(Windows鍵)打開Dash,搜索「TERM」,然後點擊「Term」圖標來打開終端窗口。
對於其他的桌面環境來說,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜單中找到終端。有些環境會在停靠欄或者面板上麵包含終端圖標。
通常情況下,你可以在終端裡面直接輸入應用程序名來啟動一個應用程序。比如說,你可以通過輸入「firefox」來啟動Firefox。
在終端啟動應用程序的好處是,你可以包含一些額外的參數。
例如,你可以通過下列命令來打開一個Firefox瀏覽窗口,然後利用默認的搜索引擎搜索相關信息:
firefox -search "linux.cn"

你可能會注意到,如果你啟動Firefox,程序打開以後,回到了終端窗口控制,這就意味著你可以繼續在終端進行工作。
通常情況下,如果你在終端啟動了應用程序,控制會切換到新啟動的應用程序,只有程序被關閉以後才會重新切換到終端控制。這是因為你在前台啟動了這個程序。
如果要在Linux終端打開應用程序並且返回終端控制,那麼你需要將應用程序啟動為後台進程。
和下面所列的命令一樣,我們可以通過增加一個(&)符號,將應用程序在後台啟動。
libreoffice &

譯者註:如果需要加參數的話,記得把&符號放在最後。
譯者註:一般情況下,關閉終端時,在這個終端啟動的後台程序也會被終止,要使終端關閉以後,後台程序依然保持執行可以使用下列命令
nohup command [arg...] &
如果應用程序目錄沒有安裝在PATH變數包含的目錄裡面的話,我們就沒有辦法直接通過應用程序名來啟動程序,必須輸入應用程序的整個路徑來啟動它。
/path/to/yourprogram &

如果你不確定程序輸入哪個Linux目錄結構的話,可以使用find或者location命令來定位它。
可以輸入下列符號來找到一個文件:
find /path/to/start/from -name programname

例如,你可以輸入下列命令來找到Firefox:
find / -name firefox

命令運行的結果會嗖的一下輸出一大堆,別擔心,你也可以通過less或者more來進行分頁查看。
find / -name firefox | more find / -name firefox | less

當find命令查找到沒有許可權訪問的文件夾時,會報出一條拒絕訪問錯誤,
你可以通過sudo命令來提示許可權。當然,如果你沒有安裝sudo的話,就只能切換到一個擁有許可權的用戶了。
sudo find / -name firefox | more

如果你知道你要查找的文件在你的當前目錄結構中,那麼你可以使用點來代替斜杠:
sudo find . -name firefox | more

你可能需要sudo來提升許可權,也可能根本就不需要,如果這個文件在你的主目錄裡面,那麼就不需要使用sudo。
有些應用程序則必須要提升許可權才能運行,否則你就會得到一大堆拒絕訪問錯誤,除非你使用一個具有許可權的用戶或者使用sudo提升許可權。
這里有個小竅門。如果你運行了一個程序,但是它需要提升許可權來操作,輸入下面命令試試:
sudo !!

方法五:
在Unix/Linux下如果想讓程序獨立終端運行,一般都是使用 & 在命令結尾來讓程序自動運行。(命令後可以不追加空格)
打開gnome-terminal,執行如下命令:
delectate@delectate:~$ totem &[1] 8510delectate@delectate:~$ 有幾點需要注意:
已經啟動的程序依然attach於當前pts,只有當前終端模擬器關閉(使用exit命令退出),進程自動被tty繼承。delectate@delectate:~$ ps -e | grep totem //程序已被以totem & 形式啟動,當前附在pts0上8819 pts/0 00:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的模擬終端被exit命令關閉,totem自動附在tty8819 ? 00:00:00 totemdelectate@delectate:~$
具有debug輸出的進程,需要按enter鍵進行中斷當前debug輸出。但是如果程序持續進行printf,你將無法輸入任何命令。delectate@delectate:~$ vlc &[1] 8850delectate@delectate:~$ VLC media player 1.0.6 Goldeneye[0x8b998b0] main libvlc: Running vlc with the default interface. Use 『cvlc』 to use vlc without interface. //enter presseddelectate@delectate:~$ //show a clean terminal now** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL』 failed //仍然在輸出數據…… //關閉程序[1]+ Done vlcdelectate@delectate:~$
你無法記錄程序的debug輸出結果。
只有當虛擬終端是 $ 或者 # 時候,才可以關閉此終端,否則可能導致已經啟動的進程被關閉(按enter——如果程序持續輸出信息而沒有出現 $ 或 #)
使用nohup命令:
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中斷/掛起信號,使命令繼續執行)
但是當你嘗試使用命令:
1nohup command
時候卻會遇到不大不小的麻煩……
delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out』
是的,雖然它自動把debug信息記錄到nohup.out文件,但是你卻無法使用這個終端進行任何操作。
所以你需要和第一個方法混用,即
nohupcommand {option}&
混用後,它會自動把你執行的命令輸出結果記錄到許可權為-rw——-,名為nohup.out的文件中。
但是你仍然需要
delectate@delectate:~$ nohup vlc &[1] 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out』 //在這里按一下回車或以ctrl+c以 //show a clean terminal delectate@delectate:~$
與使用 「&」 性質相同,當前啟動程序的終端如果沒有被關閉,已經啟動的程序附在pst上;如果終端被關閉,則自動附在tty。
如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out。默認狀態下,nohup默認輸出到nohup.out文件,你也可以利用重定向來指定輸出文件:
nohupcommand {option} > myout.file 2>&1 &
只有當虛擬終端是 $ 或者 # 時候,才可以關閉此終端,否則可能導致已經啟動的進程被關閉(按enter——如果程序持續輸出信息而沒有出現 $ 或 #)
其他相關命令:
jobs:查看當前有多少在後台運行的命令
fg:將後台中的命令調至前台繼續運行。如果後台中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後台正在執行的命令的序號(不是pid)
bg:將一個在後台暫停的命令,變成繼續執行。如果後台中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後台正在執行的命令的序號(不是pid)
殺死進程
殺死已經啟動的程序和普通方式一樣:
pkill -9 name
killall name
kill pid

命令應用:
linux伺服器掛機下載;啟動相關服務;linux伺服器啟動進程(尤其是ssh登錄)
我就曾經用 1nohup aria2c -i downloadlist -m 0 -j 1 &

Ⅸ linux下nohup 命令怎麼kill

Unix中 nohup 命令功能就是不掛斷地運行命令,同時 nohup 把程序的所有輸出到放到當前目錄 nohup.out 文件中,如果文件不可寫,則放到 <用戶主目錄>/nohup.out 文件中。那麼有了這個命令以後我們php就寫成shell 腳本使用循環來讓我們腳本一直運行下去,不管我們終端窗口是否關閉都能夠讓我們php 腳本一直運行下去。 馬上動手寫個 PHP 小程序,功能為每30秒記錄時間,寫入到文件 復制代碼 代碼如下: # vi for_ever.php #! /usr/local/php/bin/php define('ROOT', dirname(__FILE__).'/'); set_time_limit(0); while (true) { file_put_contents(ROOT.'for_ever.txt', date('Y-m-d H:i:s')."\n", FILE_APPEND); echo date('Y-m-d H:i:s'), ' OK!'; sleep(30); } ?> 保存退出,然後賦予 for_ever.php 文件可執行許可權: # chmod +x for_ever.php 讓它在再後台執行: # nohup /home/andy/for_ever.php.php & 記得最後加上 & 符號,這樣才能夠跑到後台去運行 執行上述命令後出現如下提示: [1] 5157 nohup: appending output to 'nohup.out' 所有命令執行輸出信息都會放到 nohup.out 文件中 這時你可以打開 for_ever.php 同目錄下的 for_ever.txt 和 nohup.out 看看效果! 好了,它會永遠運行下去了,怎麼結束它呢? # ps PID TTY TIME CMD 4247 pts/1 00:00:00 bash 5157 pts/1 00:00:00 for_ever.php 5265 pts/1 00:00:00 ps # kill -9 5157 找到進程號 5157 殺之,你將看到 [1]+ Killed nohup /home/andy/for_ever.php OK! ==================== 在很多項目中,或許有很多類似的後端腳本需要通過crontab定時執行。比如每10秒檢查一下用戶狀態。腳本如下: @file: /php_scripts/scan_userstatus.php 復制代碼 代碼如下: #!/usr/bin/env php -q $status = has_goaway(); if ($status) { //done } ?> 通過crontab定時執行腳本scan_userstatus.php #echo 「*:*/10 * * * * /php_scripts/scan_userstatus.php」 這樣,每隔10秒鍾,就會執行該腳本。 我們發現,在短時間內,該腳本的內存資源還沒有釋放完,又啟用了新的腳本。也就是說:新腳本啟動了,舊腳本佔用的資源還沒有如願釋放。如此,日積月累,浪費了很多內存資源。我們對這個腳本進行了一下改進,改進後如下: @file: /php_scripts/scan_userstatus.php 復制代碼 代碼如下: #/usr/bin/env php -q while (1) { $status = has_goaway(); if ($status) { //done } usleep(10000000); } ?> 這樣,不需要crontab了。可以通過以下命令執行腳本,達到相同的功能效果 #chmod +x /php_scripts/scan_userstatus.php #nohup /php_scripts/scan_userstatus.php & 在這里,我們通過&將腳本放到後台運行,為了防止隨著終端會話窗口關閉進程被殺,我們使用了nohup命令。那麼有沒有辦法,不使nohup命令,也能夠運行呢,就像Unin/Linux Daemon一樣。接下來,就是我們要講的守護進程函數。 什麼是守護進程?一個守護進程通常補認為是一個不對終端進行控制的後台任務。它有三個很顯著的特徵:在後台運行,與啟動他的進程脫離,無須控制終端。常用的實現方式是fork() -> setsid() -> fork() 詳細如下: @file: /php_scripts/scan_userstatus.php 復制代碼 代碼如下: #/usr/bin/env php -q daemonize(); while (1) { $status = has_goaway(); if ($status) { //done } usleep(10000000); } function daemonize() { $pid = pcntl_fork(); if ($pid === -1 ) { return FALSE; } else if ($pid) { usleep(500); exit(); //exit parent } chdir("/"); umask(0); $sid = posix_setsid(); if (!$sid) { return FALSE; } $pid = pcntl_fork(); if ($pid === -1) { return FALSE; } else if ($pid) { usleep(500); exit(0); } if (defined('STDIN')) { fclose(STDIN); } if (defined('STDOUT')){ fclose(STDOUT); } if (defined('STDERR')) { fclose(STDERR); } } ?> 實現了守護進程函數以後,則可以建立一個常駐進程,所以只需要執行一次: #/php_scripts/scan_userstatus.php 這里較為關鍵的二個php函數是pcntl_fork()和posix_setsid()。fork()一個進程,則表示創建了一個運行進程的副本,副本被認為是子進程,而原始進程被認為是父進程。當fork()運行之後,則可以脫離啟動他的進程與終端控制等,也意味著父進程可以自由退出。 pcntl_fork()返回值,-1表示執行失敗,0表示在子進程中,而返進程ID號,則表示在父進程中。在這里,退出父進程。setsid(),它首先使新進程成為一個新會話的「領導者」,最後使該進程不再控制終端,這也是成為守護進程最關鍵的一步,這意味著,不會隨著終端關閉而強制退出進程。對於一個不會被中斷的常駐進程來說,這是很關鍵的一步。進行最後一次fork(),這一步不是必須的,但通常都這么做,它最大的意義是防止獲得控制終端。(在直接打開一個終端設備,而且沒有使用O_NOCTTY標志的情況下, 會獲得控制終端). 其它事項說明: 1) chdir() 將守護進程放到總是存在的目錄中,另外一個好處是,你的常駐進程不會限制你umount一個文件系統。 2)umask() 設置文件模式,創建掩碼到最大的允許限度。如果一個守護進程需要創建具有可讀,可寫許可權的文件,一個被繼承的具有更嚴格許可權的掩碼會有反作用。 3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 關閉標准I/O流。注意,如果有輸出(echo),則守護進程會失敗。所以通常將STDIN, STDOUT, STDERR重定向某個指定文件.

Ⅹ Linux裡面nohub命令作用是什麼

定義: nohup 是 no hang up 的縮寫,就是不掛斷的意思,但沒有後台運行,終端不能標准輸入 用途:不掛斷地運行命令。該命令可以在你退出當前用戶/關閉終端之後繼續運行相應的進程 因為普通胡勇退出時候,程序可能...

閱讀全文

與linuxnohup命令相關的資料

熱點內容
肉寫的很詳細的小說古代 瀏覽:771
安卓怎麼下2個一樣的軟體 瀏覽:593
php怎麼解決高並發 瀏覽:733
可以穿越電影捉鬼小說 瀏覽:264
免費播放韓國愛情電影大全 瀏覽:199
一堆飛蟲聚在一起的電影 瀏覽:7
美女割乳電影 瀏覽:154
如何給信號放大器加密 瀏覽:588
禁播鬼片電影在線觀看 瀏覽:563
98看劇官網 瀏覽:917
0855電影在線觀看 瀏覽:724
當我們坐計程車到電影院 瀏覽:440
介紹敵情的英文電影 瀏覽:161
戰戀雪類似肉類 瀏覽:526
合肥工嘻嘻app找工作哪裡靠譜 瀏覽:854
97免下載電影 瀏覽:414
手機編程軟體scrat 瀏覽:936
懷舊絕版老電武打片 瀏覽:505
有一個殘疾白人老闆和一個黑人保姆的電影 瀏覽:728
javafloat轉double 瀏覽:757