新聞中心
在 Linux 系統(tǒng)中,服務(wù)是指在后臺運行的一類程序,它們能夠在系統(tǒng)啟動時自動運行,并提供某些特定的功能,比如 web 服務(wù)器、數(shù)據(jù)庫服務(wù)器等。常規(guī)的服務(wù)運行方式是在命令行終端中運行命令,但在實際應(yīng)用中,我們經(jīng)常需要將服務(wù)作為一個守護進程在后臺運行,從而使得服務(wù)的運行更加穩(wěn)定,同時也可以讓我們更加方便地管理和監(jiān)控服務(wù)。本文將探討如何在 Linux 系統(tǒng)中實現(xiàn)服務(wù)后臺運行,以提高系統(tǒng)的穩(wěn)定性。

一、Linux 服務(wù)的運行方式
在 Linux 系統(tǒng)中,服務(wù)通常會以兩種方式運行:前臺運行和后臺運行。
前臺運行是指將服務(wù)作為一個常規(guī)的程序在命令行終端中直接運行。在這種方式下,服務(wù)會一直占用當(dāng)前的終端窗口,直到服務(wù)結(jié)束或者手動終止。前臺運行的優(yōu)點是方便調(diào)試和檢查問題,但同時也存在一些缺點,比如暴露服務(wù)的啟動命令和參數(shù),風(fēng)險更大;由于服務(wù)在終端中運行,因此無法在退出終端后繼續(xù)運行。
后臺運行是指將服務(wù)運行在后臺作為守護進程運行。在這種方式下,服務(wù)會在啟動后自動隱藏在后臺,無需終端界面進行操作,直到手動終止或者服務(wù)器重啟。后臺運行的優(yōu)點是更加安全、便捷,服務(wù)可持續(xù)運行,同時也難以被用戶意外關(guān)閉,從而增加了系統(tǒng)運行的穩(wěn)定性。
二、常見的后臺運行方式
在 Linux 系統(tǒng)中,常見的后臺運行方式主要有以下兩種:
1. 使用 & 符號
& 符號可以將服務(wù)放入后臺保持運行,例如:
$ nohup command &
nohup 命令用于在服務(wù)結(jié)束了終端會話后依舊運行服務(wù)。& 符號用于將服務(wù)放入后臺運行。
此種方式的缺點是無法對服務(wù)進行關(guān)閉、重啟等操作,對于后臺運行服務(wù)的管理不夠方便。
2. 使用守護進程
守護進程是 Linux 下一種運行在后臺的服務(wù)進程,其特點是在啟動后從父進程脫離,運行獨立于終端。因此,用戶可以在關(guān)閉終端后進一步控制或關(guān)閉守護進程。
啟動一個守護進程服務(wù)需要用到一些 shell 腳本和一些常見的 Linux 命令:
step 1 創(chuàng)建一個腳本文件,用于啟動和停止服務(wù);
step 2 修改腳本文件的權(quán)限,允許執(zhí)行;
step 3 使用命令“chkconfig”將腳本注冊為服務(wù);
step 4 啟動和停止服務(wù)的命令為 service。
使用守護進程的方式可以更加方便安全地管理服務(wù),提高了系統(tǒng)的穩(wěn)定性。
三、案例分析
以 CentOS 7 為例,下面介紹如何使用守護進程的方式實現(xiàn)服務(wù)后臺運行。
1. 創(chuàng)建一個腳本文件
在 /etc/init.d/(CentOS7 以前為 /etc/rc.d/init.d/)目錄下創(chuàng)建一個腳本文件,例如:
$ vi /etc/init.d/myservice
腳本內(nèi)容參考如下:
#!/bin/bash
# chkconfig: 345 99 1
# description: myservice
start(){
echo “myservice start”
# 啟動服務(wù)
}
stop(){
echo “myservice stop”
# 停止服務(wù)
}
restart(){
echo “myservice restart”
stop
sleep 1
start
}
case “$1” in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $”Usage: $0 {start|stop|restart}”
exit 1
esac
將上述腳本文件保存并退出。
2. 修改腳本文件權(quán)限
使用 chmod 命令更改文件權(quán)限:
$ chmod +x /etc/init.d/myservice
3. 注冊腳本文件為服務(wù)
使用 chkconfig 命令將腳本注冊為系統(tǒng)服務(wù):
$ chkconfig –add myservice
$ chkconfig myservice on
4. 啟動和停止服務(wù)
使用 service 命令即可啟動和停止服務(wù):
$ service myservice start
$ service myservice stop
使用守護進程的方式可以將服務(wù)啟動在后臺運行,并且可以通過 service 命令啟動和停止服務(wù),比使用 & 符號的方式更加方便管理。
四、
Linux 服務(wù)的后臺運行是 Linux 系統(tǒng)中一個非常重要的特性,它可以將服務(wù)保持在后臺運行,有利于系統(tǒng)穩(wěn)定性和便捷性。在本文中,我們探討了 Linux 中服務(wù)的運行方式以及常見的后臺運行方式,并以 CentOS 7 為例,介紹了使用守護進程的方式實現(xiàn)服務(wù)后臺運行的方法。我們相信,通過本文的介紹,讀者可以更加深入地了解 Linux 服務(wù)的后臺運行方式,并能夠更加方便地管理系統(tǒng)服務(wù),提高系統(tǒng)的穩(wěn)定性。
相關(guān)問題拓展閱讀:
- linux如何設(shè)置程序開機啟動后臺運行?
- Linux后臺不間斷運行指令
- linux下如何通過按鍵將當(dāng)前進程放入后臺運行
linux如何設(shè)置程序開機啟動后臺運行?
如運行一個火狐瀏覽器 直接在終端:虧哪高firefox &
jobs查看在后臺執(zhí)行的進程
fg %n將后臺執(zhí)行進程n調(diào)到前臺執(zhí)行,n表示jobnumber(通過jobs查看的進程編號,而非pid)
ctrl+z將在前臺執(zhí)行的進程,放到后臺并掛起
bg %n將在后臺緩晌掛起的進程,繼續(xù)執(zhí)行
ctrl+c前臺進程終止
kill %n殺掉后臺運行的進程,n表示jobnumber(通過jobs查看的進程編號,而非pid)命令介紹可查看“Linux命令大全銷尺”。
有些時候,我們需要在終端啟動一個程序,并使之運行——但是如果關(guān)閉終端,那么這個程序也就隨著關(guān)閉了。那么有沒有什么方法在關(guān)閉終端后,讓已經(jīng)從這個終端啟動的程序繼續(xù)運行呢?有以下方法
1.讓linux忽略終端的hung up 信號,不關(guān)閉進程;
2.讓此進程變州肆信為終端的非子進程。
方法一:
在終端輸入命令:
# ./pso > pso.file 2>&1 &
解釋:將pso直接放在后臺運行,并把終端輸出存放在當(dāng)前目錄下的pso.file文件中。
當(dāng)客戶端關(guān)機后重新登陸服務(wù)器后,直接查看pso.file文件就可看執(zhí)行結(jié)果(命
令:#cat pso.file )。
或者
在終端輸入命令:
# nohup ./pso > pso.file 2>&1 &
解釋:nohup就是不掛起的意思,將pso直接放在后臺運行,并把終端輸出存放在當(dāng)前
目錄下的pso.file文件中。當(dāng)客戶端關(guān)機后重新登陸服務(wù)器后,直接查看pso.file
文件就可看執(zhí)行結(jié)果(命令:#cat pso.file )。
方法二:
實現(xiàn)方案就是nohup命令。
例如要啟動jboss,可以nohup ./run.sh &。這樣就可以了,結(jié)尾的“&”符號表示后臺啟動jboss,從而不影響繼續(xù)運行其他命令。
但這樣有一個問題,nohup命令雖然可以讓linux“放過”這個進程,但是nohup會同時把進程的控制臺輸出重定向到nohup.txt下(默認(rèn)是這個文件),當(dāng)然可以重定向為其他的文件,但是輸出總會有的。
如果jboss運行很長時間,而且如果有很多控制臺輸出的話,nohup.txt文件就會變的很大很大。
通常項目中的日志都會輸出到特定的日志文件或者輸出到
數(shù)據(jù)庫
中,也就是說控制臺的輸出對于程序的意義不大,那么可不可以拋棄掉這些輸出呢?答案雹消是肯定的。
這里講解一下linux的重定向(注意,是linux的重定向,不是針對nohup)。
0、1和2分別表示標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤信息輸出,可以用來指定需要重定向的標(biāo)準(zhǔn)輸入或輸出。
在一般使用時,默認(rèn)的是標(biāo)準(zhǔn)輸出,既1.當(dāng)我們需要特殊用途時,可以使用其他標(biāo)號。例如,將某個程序的錯誤信息輸出到log文件中:./program 2>log。這樣標(biāo)準(zhǔn)輸出還是在屏幕上,但是錯誤信息會輸出到log文件中。
另外,也可以實現(xiàn)0,1,2之間的重定向。2>&1:將錯誤信息重定向到標(biāo)準(zhǔn)輸出。
Linux下還有一個特殊的文件/dev/null,它就像一個無底洞,所有重定向到它的信息都會消失得無影無蹤。
結(jié)合nohup,我們可以這樣
nohup ./run.sh >/dev/null &
這是最簡單的一種方式,既保證了程序能夠一直后臺執(zhí)行,又能冊輪保證不會產(chǎn)生太大的nohup.txt文件。
方法三:
利用的linux的一個機制,讓程序在subshell中執(zhí)行,方法很簡單,將命令用括號() 括起來即可。
ps -ef | grep test
可以看到run.sh的父進程為1,不是當(dāng)前終端了,這樣就能忽略hung up信號。
當(dāng)然linux還可以動態(tài)的讓程序后臺運行或不被hung up 信號關(guān)閉,例如disown命令,setid命令等。
方法四:
如果是使用Ubuntu的話,你可以利用CTRL+ALT+T組合鍵打開終端。當(dāng)然你也可以使用超級鍵(Windows鍵)打開Dash,搜索“TERM”,然后點擊“Term”圖標(biāo)來打開終端窗口。
對于其他的桌面環(huán)境來說,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜單中找到終端。有些環(huán)境會在??繖诨蛘呙姘迳厦姘K端圖標(biāo)。
通常情況下,你可以在終端里面直接輸入應(yīng)用程序名來啟動一個應(yīng)用程序。比如說,你可以通過輸入“firefox”來啟動Firefox。
在終端啟動應(yīng)用程序的好處是,你可以包含一些額外的參數(shù)。
例如,你可以通過下列命令來打開一個Firefox瀏覽窗口,然后利用默認(rèn)的搜索引擎搜索相關(guān)信息:
firefox -search “l(fā)inux.cn”
你可能會注意到,如果你啟動Firefox,程序打開以后,回到了終端窗口控制,這就意味著你可以繼續(xù)在終端進行工作。
通常情況下,如果你在終端啟動了應(yīng)用程序,控制會切換到新啟動的應(yīng)用程序,只有程序被關(guān)閉以后才會重新切換到終端控制。這是因為你在前臺啟動了這個程序。
如果要在Linux終端打開應(yīng)用程序并且返回終端控制,那么你需要將應(yīng)用程序啟動為后臺進程。
和下面所列的命令一樣,我們可以通過增加一個(&)符號,將應(yīng)用程序在后臺啟動。
libreoffice &
譯者注:如果需要加參數(shù)的話,記得把&符號放在最后。
譯者注:一般情況下,關(guān)閉終端時,在這個終端啟動的后臺程序也會被終止,要使終端關(guān)閉以后,后臺程序依然保持執(zhí)行可以使用下列命令
nohup command &
如果應(yīng)用程序目錄沒有安裝在PATH變量包含的目錄里面的話,我們就沒有辦法直接通過應(yīng)用程序名來啟動程序,必須輸入應(yīng)用程序的整個路徑來啟動它。
/path/to/yourprogram &
如果你不確定程序輸入哪個Linux目錄結(jié)構(gòu)的話,可以使用find或者location命令來定位它。
可以輸入下列符號來找到一個文件:
find /path/to/start/from -name programname
例如,你可以輸入下列命令來找到Firefox:
find / -name firefox
命令運行的結(jié)果會嗖的一下輸出一大堆,別擔(dān)心,你也可以通過less或者more來進行分頁查看。
find / -name firefox | more find / -name firefox | less
當(dāng)find命令查找到?jīng)]有權(quán)限訪問的文件夾時,會報出一條拒絕訪問錯誤,
你可以通過sudo命令來提示權(quán)限。當(dāng)然,如果你沒有安裝sudo的話,就只能切換到一個擁有權(quán)限的用戶了。
sudo find / -name firefox | more
如果你知道你要查找的文件在你的當(dāng)前目錄結(jié)構(gòu)中,那么你可以使用點來代替斜杠:
sudo find . -name firefox | more
你可能需要sudo來提升權(quán)限,也可能根本就不需要,如果這個文件在你的主目錄里面,那么就不需要使用sudo。
有些應(yīng)用程序則必須要提升權(quán)限才能運行,否則你就會得到一大堆拒絕訪問錯誤,除非你使用一個具有權(quán)限的用戶或者使用sudo提升權(quán)限。
這里有個小竅門。如果你運行了一個程序,但是它需要提升權(quán)限來操作,輸入下面命令試試:
sudo !!
方法五:
在Unix/Linux下如果想讓程序獨立終端運行,一般都是使用 & 在命令結(jié)尾來讓程序自動運行。(命令后可以不追加空格)
打開gnome-terminal,執(zhí)行如下命令:
delectate@delectate:~$ totem & 8510delectate@delectate:~$ 有幾點需要注意:
已經(jīng)啟動的程序依然attach于當(dāng)前pts,只有當(dāng)前終端模擬器關(guān)閉(使用exit命令退出),進程自動被tty繼承。delectate@delectate:~$ ps -e | grep totem //程序已被以totem & 形式啟動,當(dāng)前附在pts0上8819 pts/:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的模擬終端被exit命令關(guān)閉,totem自動附在tty8819 ?:00:00 totemdelectate@delectate:~$
具有debug輸出的進程,需要按enter鍵進行中斷當(dāng)前debug輸出。但是如果程序持續(xù)進行printf,你將無法輸入任何命令。delectate@delectate:~$ vlc & 8850delectate@delectate:~$ VLC media player 1.0.6 Goldeneye 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//仍然在輸出數(shù)據(jù)……//關(guān)閉程序+ Done vlcdelectate@delectate:~$
你無法記錄程序的debug輸出結(jié)果。
只有當(dāng)虛擬終端是 $ 或者 # 時候,才可以關(guān)閉此終端,否則可能導(dǎo)致已經(jīng)啟動的進程被關(guān)閉(按enter——如果程序持續(xù)輸出信息而沒有出現(xiàn) $ 或 #)
使用nohup命令:
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中斷/掛起信號,使命令繼續(xù)執(zhí)行)
但是當(dāng)你嘗試使用命令:
1nohup command
時候卻會遇到不大不小的麻煩……
delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out’
是的,雖然它自動把debug信息記錄到nohup.out文件,但是你卻無法使用這個終端進行任何操作。
所以你需要和之一個方法混用,即
nohupcommand {option}&
混用后,它會自動把你執(zhí)行的命令輸出結(jié)果記錄到權(quán)限為-rw——-,名為nohup.out的文件中。
但是你仍然需要
delectate@delectate:~$ nohup vlc & 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out’ //在這里按一下回車或以ctrl+c以//show a clean terminal delectate@delectate:~$
與使用 “&” 性質(zhì)相同,當(dāng)前啟動程序的終端如果沒有被關(guān)閉,已經(jīng)啟動的程序附在pst上;如果終端被關(guān)閉,則自動附在tty。
如果當(dāng)前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out。默認(rèn)狀態(tài)下,nohup默認(rèn)輸出到nohup.out文件,你也可以利用重定向來指定輸出文件:
nohupcommand {option} > myout.file 2>&1 &
只有當(dāng)虛擬終端是 $ 或者 # 時候,才可以關(guān)閉此終端,否則可能導(dǎo)致已經(jīng)啟動的進程被關(guān)閉(按enter——如果程序持續(xù)輸出信息而沒有出現(xiàn) $ 或 #)
其他相關(guān)命令:
jobs:查看當(dāng)前有多少在后臺運行的命令
fg:將后臺中的命令調(diào)至前臺繼續(xù)運行。如果后臺中有多個命令,可以用 fg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid)
bg:將一個在后臺暫停的命令,變成繼續(xù)執(zhí)行。如果后臺中有多個命令,可以用bg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid)
殺死進程
殺死已經(jīng)啟動的程序和普通方式一樣:
pkill -9 name
killall name
kill pid
…
命令應(yīng)用:
linux服務(wù)器掛機下載;啟動相關(guān)服務(wù);linux服務(wù)器啟動進程(尤其是ssh登錄)
我就曾經(jīng)用 1nohup aria2c -i downloadlist -m 0 -j 1 &
1. 開機啟動時自動運行程序
Linux加載后, 它將初始化硬件和設(shè)備驅(qū)動, 然后運行之一個進程init。init根據(jù)配置文件繼續(xù)引導(dǎo)過程,啟動其它進程。通衡好常情況下,修改放置在
/etc/rc或
/etc/rc.d 或
/etc/rc?.d
目錄下的腳本文件,可以使init自動啟動其它程序。例如:編輯轎爛/etc/rc.d/rc.local 文件(該文件通常是系統(tǒng)最后啟動的腳本),在文件最末加上一行“xinit”或“startx”,可以在開機啟動后直接進閉攔漏入X-Window。
2. 登錄時自動運行程序
用戶登錄時,bash先自動執(zhí)行系統(tǒng)管理員建立的全局登錄script :
/ect/profile
然后bash在用戶起始目錄下按順序查找三個特殊文件中的一個:
/.bash_profile、
/.bash_login、
/.profile,
Linux后臺不間斷運行指令
1.nohup
用途:不掛斷地運行命令。
語法:nohup Command
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當(dāng)前目錄的 nohup.out 文件中。
如果當(dāng)前目錄的 nohup.out 文件不顫枝可寫,輸出重定向到 $HOME/nohup.out 文件中。
如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。
退出狀態(tài):該命令返回下列出口值:
可以查找但不能調(diào)用 Command 參數(shù)指定的命令。
nohup 命令發(fā)生錯誤或不能查找由 Command 參數(shù)指定的命令。
否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)纖洞渣指定命毀悄令的退出狀態(tài)。
2.&
用途:在后臺運行
一般兩個一起用
nohup command &
linux下如何通過按鍵將當(dāng)前進程放入后臺運行
ctrl+Z,把前臺文件放入后臺并暫停(注意,放旦坦入后臺后模改桐是會被暫停的)。
要放入后臺,直接在命令后面加殲嫌個&就好(但是注意退出登錄狀態(tài)時程序也會停止)。
所以我日常都是用nohup
命令
&,這個樣子去后臺運行的。
關(guān)于linux 將服務(wù)后臺運行的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機房服務(wù)器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務(wù)器托管、機柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動、聯(lián)通機房等。
網(wǎng)頁標(biāo)題:Linux實現(xiàn)服務(wù)后臺運行,提升系統(tǒng)穩(wěn)定性(linux將服務(wù)后臺運行)
本文網(wǎng)址:http://m.fisionsoft.com.cn/article/coiesho.html


咨詢
建站咨詢
