當前位置:首頁 » 編程軟體 » 獲取nohub腳本運行狀態

獲取nohub腳本運行狀態

發布時間: 2022-08-19 06:29:52

① 如何獲取ssh執行的nohup進程的返回碼

改寫為:(nohup./a)&(nohup./b)&(nohup./c)&wait說明:開啟三個子shell在後台執行操作,()表示開啟子shell,若不加圓括弧直接這樣寫,則直接在父shell操作,可能造成邏輯錯誤,因為這個不是在命令行執行的進程,wait根據實際情況添加,表示等前面三個進程執行結束在進行下一步

linux shell腳本 nohup問題求助

你不應該放在profile,每個用戶登錄都會運行一次的。你確定hosts文件在mali目錄下?不是mail?

另外你應該把這段代碼寫成腳本 在profile中以nohup 加後台的方式運行這個腳本。

比如 保存到/etc/init_kafka
然後在 profile中添加
nohup /etc/init_kafaka &

③ 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怎麼查詢nohup的進程

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

⑤ 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

⑥ 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 &

⑦ 怎麼查看運行中的nohup腳本

在腳本nohup設置每天開始拷貝日誌作為前一天的日誌備份,然後把當前日誌清空即可,代碼如下:crontab -e//增加:0 0 * * * cp /dirname/logfile.log /bakdir/logfile.`date -d yesterday +%Y%m%d`.log; cat /dev/null > /dirname/logfile.log//每周日凌晨1:00打包、刪除文件:0 1 * * 0 cd /bakdir; find ./ +mtime 7 -exec tar cvf logfile.`date -d yesterday +%Y%U`.tar {} \; ;find ./ -mtime 91 -exec rm -f {} \;

⑧ 怎麼查找nohup出錯後的日誌文件

nohup執行shell腳本以後,會出現很多的.log文件。
你可以在命令行下執行grep -il error *.log命令運行一下,看看哪些log文件裡面報錯!
進入log文件以後,用/error就可以快速搜索到報錯的地方。

⑨ linux下 我用nohup運行腳本咩~ 就是 nohup xxx.sh > xxx.log

logrotate
你自己man logrotate吧

⑩ linux命令,nohup,執行腳本a.sh後,輸入命令yes

互動式進程要放到後台的話,還是用screen比較好
首先,運行 screen 進入終端
執行你的程序
按 ctrl + a ,再按 d 鍵可以暫時退出終端
當要返回時, 先查看剛才的終端進程ID, screen -list
然後 screen -r xx(剛才的進程ID)就可以了

熱點內容
壓縮包如何在電腦解壓 發布:2025-03-21 22:47:06 瀏覽:94
java氣候 發布:2025-03-21 22:37:19 瀏覽:142
外文期刊資料庫檢索 發布:2025-03-21 22:37:05 瀏覽:9
時間大使莫莫ftp 發布:2025-03-21 22:36:24 瀏覽:842
qtp腳本循環 發布:2025-03-21 22:28:05 瀏覽:279
寫腳本人員 發布:2025-03-21 22:21:07 瀏覽:56
sql一個表另一個表 發布:2025-03-21 22:19:27 瀏覽:463
安卓收割機哪個型號好 發布:2025-03-21 22:12:34 瀏覽:87
安卓怎麼盈利 發布:2025-03-21 22:11:01 瀏覽:581
華為大容量存儲 發布:2025-03-21 22:10:15 瀏覽:912