新聞中心
在Linux操作系統(tǒng)中,進(jìn)程是系統(tǒng)中最基本的執(zhí)行單元之一。一個(gè)程序如果要在Linux系統(tǒng)中執(zhí)行,必須通過(guò)創(chuàng)建進(jìn)程進(jìn)行。此時(shí),每一個(gè)進(jìn)程都有一個(gè)父進(jìn)程,父進(jìn)程可以通過(guò)某些方式來(lái)管理或監(jiān)控其子進(jìn)程。本文將介紹如何設(shè)置一個(gè)進(jìn)程的父進(jìn)程。

米林ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!
父進(jìn)程與子進(jìn)程
我們需要明確父進(jìn)程與子進(jìn)程之間的關(guān)系。在Linux系統(tǒng)中,每個(gè)進(jìn)程在創(chuàng)建時(shí),都將獲得一個(gè)唯一的PID(進(jìn)程標(biāo)識(shí)符)。當(dāng)一個(gè)進(jìn)程(父進(jìn)程)創(chuàng)建另一個(gè)進(jìn)程(子進(jìn)程)時(shí),父進(jìn)程將向操作系統(tǒng)申請(qǐng)一段內(nèi)存區(qū)域,用來(lái)存儲(chǔ)子進(jìn)程的各種信息,如進(jìn)程ID、進(jìn)程名稱、父進(jìn)程ID等。此時(shí),子進(jìn)程運(yùn)行時(shí),其父進(jìn)程ID就是父進(jìn)程的PID。
如何設(shè)置進(jìn)程的父進(jìn)程
在Linux系統(tǒng)中,一個(gè)進(jìn)程可以使用系統(tǒng)調(diào)用fork()創(chuàng)建一個(gè)子進(jìn)程。fork()函數(shù)會(huì)返回兩次,一次是在父進(jìn)程中,另一次是在子進(jìn)程中。父進(jìn)程中的返回值是子進(jìn)程的PID,而子進(jìn)程中的返回值總是0。所以要判斷進(jìn)程是否是父進(jìn)程,只需判斷fork()的返回值即可。
一開(kāi)始,每個(gè)進(jìn)程都有一個(gè)父進(jìn)程,如果需要修改進(jìn)程的父進(jìn)程,可以使用系統(tǒng)調(diào)用setpgid()。該函數(shù)的原型為:
int setpgid(pid_t pid, pid_t pgid);
其中,pid表示進(jìn)程的ID,pgid表示將要設(shè)置的進(jìn)程組ID。調(diào)用該函數(shù)后,進(jìn)程pid的父進(jìn)程ID將會(huì)被設(shè)置為pgid進(jìn)程所在的進(jìn)程組的ID。
示例代碼:
“`c
#include
#include
int mn() {
pid_t pid;
pid = fork();
if(pid == 0){
//子進(jìn)程
setpgid(0, 0);
}else if(pid > 0){
//父進(jìn)程
setpgid(pid, pid);
}
while(1){
sleep(1);
}
return 0;
}
“`
在上面的代碼中,父進(jìn)程調(diào)用setpgid(pid, pid)將子進(jìn)程的父進(jìn)程ID設(shè)置為子進(jìn)程的PID。
在子進(jìn)程中,調(diào)用setpgid(0, 0)將其父進(jìn)程ID設(shè)置為進(jìn)程組ID相同的進(jìn)程。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
linux如何設(shè)置程序開(kāi)機(jī)啟動(dòng)后臺(tái)運(yùn)行?
如運(yùn)行一個(gè)火狐瀏覽器 直接在終端:虧哪高firefox &
jobs查看在后臺(tái)執(zhí)行的進(jìn)程
fg %n將后臺(tái)執(zhí)行進(jìn)程n調(diào)到前臺(tái)執(zhí)行,n表示jobnumber(通過(guò)jobs查看的進(jìn)程編號(hào),而非pid)
ctrl+z將在前臺(tái)執(zhí)行的進(jìn)程,放到后臺(tái)并掛起
bg %n將在后臺(tái)緩晌掛起的進(jìn)程,繼續(xù)執(zhí)行
ctrl+c前臺(tái)進(jìn)程終止
kill %n殺掉后臺(tái)運(yùn)行的進(jìn)程,n表示jobnumber(通過(guò)jobs查看的進(jìn)程編號(hào),而非pid)命令介紹可查看“Linux命令大全銷尺”。
有些時(shí)候,我們需要在終端啟動(dòng)一個(gè)程序,并使之運(yùn)行——但是如果關(guān)閉終端,那么這個(gè)程序也就隨著關(guān)閉了。那么有沒(méi)有什么方法在關(guān)閉終端后,讓已經(jīng)從這個(gè)終端啟動(dòng)的程序繼續(xù)運(yùn)行呢?有以下方法
1.讓linux忽略終端的hung up 信號(hào),不關(guān)閉進(jìn)程;
2.讓此進(jìn)程變州肆信為終端的非子進(jìn)程。
方法一:
在終端輸入命令:
# ./pso > pso.file 2>&1 &
解釋:將pso直接放在后臺(tái)運(yùn)行,并把終端輸出存放在當(dāng)前目錄下的pso.file文件中。
當(dāng)客戶端關(guān)機(jī)后重新登陸服務(wù)器后,直接查看pso.file文件就可看執(zhí)行結(jié)果(命
令:#cat pso.file )。
或者
在終端輸入命令:
# nohup ./pso > pso.file 2>&1 &
解釋:nohup就是不掛起的意思,將pso直接放在后臺(tái)運(yùn)行,并把終端輸出存放在當(dāng)前
目錄下的pso.file文件中。當(dāng)客戶端關(guān)機(jī)后重新登陸服務(wù)器后,直接查看pso.file
文件就可看執(zhí)行結(jié)果(命令:#cat pso.file )。
方法二:
實(shí)現(xiàn)方案就是nohup命令。
例如要啟動(dòng)jboss,可以nohup ./run.sh &。這樣就可以了,結(jié)尾的“&”符號(hào)表示后臺(tái)啟動(dòng)jboss,從而不影響繼續(xù)運(yùn)行其他命令。
但這樣有一個(gè)問(wèn)題,nohup命令雖然可以讓linux“放過(guò)”這個(gè)進(jìn)程,但是nohup會(huì)同時(shí)把進(jìn)程的控制臺(tái)輸出重定向到nohup.txt下(默認(rèn)是這個(gè)文件),當(dāng)然可以重定向?yàn)槠渌奈募?,但是輸出總?huì)有的。
如果jboss運(yùn)行很長(zhǎng)時(shí)間,而且如果有很多控制臺(tái)輸出的話,nohup.txt文件就會(huì)變的很大很大。
通常項(xiàng)目中的日志都會(huì)輸出到特定的日志文件或者輸出到
數(shù)據(jù)庫(kù)
中,也就是說(shuō)控制臺(tái)的輸出對(duì)于程序的意義不大,那么可不可以拋棄掉這些輸出呢?答案雹消是肯定的。
這里講解一下linux的重定向(注意,是linux的重定向,不是針對(duì)nohup)。
0、1和2分別表示標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤信息輸出,可以用來(lái)指定需要重定向的標(biāo)準(zhǔn)輸入或輸出。
在一般使用時(shí),默認(rèn)的是標(biāo)準(zhǔn)輸出,既1.當(dāng)我們需要特殊用途時(shí),可以使用其他標(biāo)號(hào)。例如,將某個(gè)程序的錯(cuò)誤信息輸出到log文件中:./program 2>log。這樣標(biāo)準(zhǔn)輸出還是在屏幕上,但是錯(cuò)誤信息會(huì)輸出到log文件中。
另外,也可以實(shí)現(xiàn)0,1,2之間的重定向。2>&1:將錯(cuò)誤信息重定向到標(biāo)準(zhǔn)輸出。
Linux下還有一個(gè)特殊的文件/dev/null,它就像一個(gè)無(wú)底洞,所有重定向到它的信息都會(huì)消失得無(wú)影無(wú)蹤。
結(jié)合nohup,我們可以這樣
nohup ./run.sh >/dev/null &
這是最簡(jiǎn)單的一種方式,既保證了程序能夠一直后臺(tái)執(zhí)行,又能冊(cè)輪保證不會(huì)產(chǎn)生太大的nohup.txt文件。
方法三:
利用的linux的一個(gè)機(jī)制,讓程序在subshell中執(zhí)行,方法很簡(jiǎn)單,將命令用括號(hào)() 括起來(lái)即可。
ps -ef | grep test
可以看到run.sh的父進(jìn)程為1,不是當(dāng)前終端了,這樣就能忽略hung up信號(hào)。
當(dāng)然linux還可以動(dòng)態(tài)的讓程序后臺(tái)運(yùn)行或不被hung up 信號(hào)關(guān)閉,例如disown命令,setid命令等。
方法四:
如果是使用Ubuntu的話,你可以利用CTRL+ALT+T組合鍵打開(kāi)終端。當(dāng)然你也可以使用超級(jí)鍵(Windows鍵)打開(kāi)Dash,搜索“TERM”,然后點(diǎn)擊“Term”圖標(biāo)來(lái)打開(kāi)終端窗口。
對(duì)于其他的桌面環(huán)境來(lái)說(shuō),例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜單中找到終端。有些環(huán)境會(huì)在停靠欄或者面板上面包含終端圖標(biāo)。
通常情況下,你可以在終端里面直接輸入應(yīng)用程序名來(lái)啟動(dòng)一個(gè)應(yīng)用程序。比如說(shuō),你可以通過(guò)輸入“firefox”來(lái)啟動(dòng)Firefox。
在終端啟動(dòng)應(yīng)用程序的好處是,你可以包含一些額外的參數(shù)。
例如,你可以通過(guò)下列命令來(lái)打開(kāi)一個(gè)Firefox瀏覽窗口,然后利用默認(rèn)的搜索引擎搜索相關(guān)信息:
firefox -search “l(fā)inux.cn”
你可能會(huì)注意到,如果你啟動(dòng)Firefox,程序打開(kāi)以后,回到了終端窗口控制,這就意味著你可以繼續(xù)在終端進(jìn)行工作。
通常情況下,如果你在終端啟動(dòng)了應(yīng)用程序,控制會(huì)切換到新啟動(dòng)的應(yīng)用程序,只有程序被關(guān)閉以后才會(huì)重新切換到終端控制。這是因?yàn)槟阍谇芭_(tái)啟動(dòng)了這個(gè)程序。
如果要在Linux終端打開(kāi)應(yīng)用程序并且返回終端控制,那么你需要將應(yīng)用程序啟動(dòng)為后臺(tái)進(jìn)程。
和下面所列的命令一樣,我們可以通過(guò)增加一個(gè)(&)符號(hào),將應(yīng)用程序在后臺(tái)啟動(dòng)。
libreoffice &
譯者注:如果需要加參數(shù)的話,記得把&符號(hào)放在最后。
譯者注:一般情況下,關(guān)閉終端時(shí),在這個(gè)終端啟動(dòng)的后臺(tái)程序也會(huì)被終止,要使終端關(guān)閉以后,后臺(tái)程序依然保持執(zhí)行可以使用下列命令
nohup command &
如果應(yīng)用程序目錄沒(méi)有安裝在PATH變量包含的目錄里面的話,我們就沒(méi)有辦法直接通過(guò)應(yīng)用程序名來(lái)啟動(dòng)程序,必須輸入應(yīng)用程序的整個(gè)路徑來(lái)啟動(dòng)它。
/path/to/yourprogram &
如果你不確定程序輸入哪個(gè)Linux目錄結(jié)構(gòu)的話,可以使用find或者location命令來(lái)定位它。
可以輸入下列符號(hào)來(lái)找到一個(gè)文件:
find /path/to/start/from -name programname
例如,你可以輸入下列命令來(lái)找到Firefox:
find / -name firefox
命令運(yùn)行的結(jié)果會(huì)嗖的一下輸出一大堆,別擔(dān)心,你也可以通過(guò)less或者more來(lái)進(jìn)行分頁(yè)查看。
find / -name firefox | more find / -name firefox | less
當(dāng)find命令查找到?jīng)]有權(quán)限訪問(wèn)的文件夾時(shí),會(huì)報(bào)出一條拒絕訪問(wèn)錯(cuò)誤,
你可以通過(guò)sudo命令來(lái)提示權(quán)限。當(dāng)然,如果你沒(méi)有安裝sudo的話,就只能切換到一個(gè)擁有權(quán)限的用戶了。
sudo find / -name firefox | more
如果你知道你要查找的文件在你的當(dāng)前目錄結(jié)構(gòu)中,那么你可以使用點(diǎn)來(lái)代替斜杠:
sudo find . -name firefox | more
你可能需要sudo來(lái)提升權(quán)限,也可能根本就不需要,如果這個(gè)文件在你的主目錄里面,那么就不需要使用sudo。
有些應(yīng)用程序則必須要提升權(quán)限才能運(yùn)行,否則你就會(huì)得到一大堆拒絕訪問(wèn)錯(cuò)誤,除非你使用一個(gè)具有權(quán)限的用戶或者使用sudo提升權(quán)限。
這里有個(gè)小竅門(mén)。如果你運(yùn)行了一個(gè)程序,但是它需要提升權(quán)限來(lái)操作,輸入下面命令試試:
sudo !!
方法五:
在Unix/Linux下如果想讓程序獨(dú)立終端運(yùn)行,一般都是使用 & 在命令結(jié)尾來(lái)讓程序自動(dòng)運(yùn)行。(命令后可以不追加空格)
打開(kāi)gnome-terminal,執(zhí)行如下命令:
delectate@delectate:~$ totem & 8510delectate@delectate:~$ 有幾點(diǎn)需要注意:
已經(jīng)啟動(dòng)的程序依然attach于當(dāng)前pts,只有當(dāng)前終端模擬器關(guān)閉(使用exit命令退出),進(jìn)程自動(dòng)被tty繼承。delectate@delectate:~$ ps -e | grep totem //程序已被以totem & 形式啟動(dòng),當(dāng)前附在pts0上8819 pts/:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的模擬終端被exit命令關(guān)閉,totem自動(dòng)附在tty8819 ?:00:00 totemdelectate@delectate:~$
具有debug輸出的進(jìn)程,需要按enter鍵進(jìn)行中斷當(dāng)前debug輸出。但是如果程序持續(xù)進(jìn)行printf,你將無(wú)法輸入任何命令。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:~$
你無(wú)法記錄程序的debug輸出結(jié)果。
只有當(dāng)虛擬終端是 $ 或者 # 時(shí)候,才可以關(guān)閉此終端,否則可能導(dǎo)致已經(jīng)啟動(dòng)的進(jìn)程被關(guān)閉(按enter——如果程序持續(xù)輸出信息而沒(méi)有出現(xiàn) $ 或 #)
使用nohup命令:
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中斷/掛起信號(hào),使命令繼續(xù)執(zhí)行)
但是當(dāng)你嘗試使用命令:
1nohup command
時(shí)候卻會(huì)遇到不大不小的麻煩……
delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out’
是的,雖然它自動(dòng)把debug信息記錄到nohup.out文件,但是你卻無(wú)法使用這個(gè)終端進(jìn)行任何操作。
所以你需要和之一個(gè)方法混用,即
nohupcommand {option}&
混用后,它會(huì)自動(dòng)把你執(zhí)行的命令輸出結(jié)果記錄到權(quán)限為-rw——-,名為nohup.out的文件中。
但是你仍然需要
delectate@delectate:~$ nohup vlc & 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out’ //在這里按一下回車(chē)或以ctrl+c以//show a clean terminal delectate@delectate:~$
與使用 “&” 性質(zhì)相同,當(dāng)前啟動(dòng)程序的終端如果沒(méi)有被關(guān)閉,已經(jīng)啟動(dòng)的程序附在pst上;如果終端被關(guān)閉,則自動(dòng)附在tty。
如果當(dāng)前目錄的 nohup.out 文件不可寫(xiě),輸出重定向到 $HOME/nohup.out。默認(rèn)狀態(tài)下,nohup默認(rèn)輸出到nohup.out文件,你也可以利用重定向來(lái)指定輸出文件:
nohupcommand {option} > myout.file 2>&1 &
只有當(dāng)虛擬終端是 $ 或者 # 時(shí)候,才可以關(guān)閉此終端,否則可能導(dǎo)致已經(jīng)啟動(dòng)的進(jìn)程被關(guān)閉(按enter——如果程序持續(xù)輸出信息而沒(méi)有出現(xiàn) $ 或 #)
其他相關(guān)命令:
jobs:查看當(dāng)前有多少在后臺(tái)運(yùn)行的命令
fg:將后臺(tái)中的命令調(diào)至前臺(tái)繼續(xù)運(yùn)行。如果后臺(tái)中有多個(gè)命令,可以用 fg %jobnumber將選中的命令調(diào)出,%jobnumber是通過(guò)jobs命令查到的后臺(tái)正在執(zhí)行的命令的序號(hào)(不是pid)
bg:將一個(gè)在后臺(tái)暫停的命令,變成繼續(xù)執(zhí)行。如果后臺(tái)中有多個(gè)命令,可以用bg %jobnumber將選中的命令調(diào)出,%jobnumber是通過(guò)jobs命令查到的后臺(tái)正在執(zhí)行的命令的序號(hào)(不是pid)
殺死進(jìn)程
殺死已經(jīng)啟動(dòng)的程序和普通方式一樣:
pkill -9 name
killall name
kill pid
…
命令應(yīng)用:
linux服務(wù)器掛機(jī)下載;啟動(dòng)相關(guān)服務(wù);linux服務(wù)器啟動(dòng)進(jìn)程(尤其是ssh登錄)
我就曾經(jīng)用 1nohup aria2c -i downloadlist -m 0 -j 1 &
1. 開(kāi)機(jī)啟動(dòng)時(shí)自動(dòng)運(yùn)行程序
Linux加載后, 它將初始化硬件和設(shè)備驅(qū)動(dòng), 然后運(yùn)行之一個(gè)進(jìn)程init。init根據(jù)配置文件繼續(xù)引導(dǎo)過(guò)程,啟動(dòng)其它進(jìn)程。通衡好常情況下,修改放置在
/etc/rc或
/etc/rc.d 或
/etc/rc?.d
目錄下的腳本文件,可以使init自動(dòng)啟動(dòng)其它程序。例如:編輯轎爛/etc/rc.d/rc.local 文件(該文件通常是系統(tǒng)最后啟動(dòng)的腳本),在文件最末加上一行“xinit”或“startx”,可以在開(kāi)機(jī)啟動(dòng)后直接進(jìn)閉攔漏入X-Window。
2. 登錄時(shí)自動(dòng)運(yùn)行程序
用戶登錄時(shí),bash先自動(dòng)執(zhí)行系統(tǒng)管理員建立的全局登錄script :
/ect/profile
然后bash在用戶起始目錄下按順序查找三個(gè)特殊文件中的一個(gè):
/.bash_profile、
/.bash_login、
/.profile,
關(guān)于linux 設(shè)置父進(jìn)程的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡(jiǎn)稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開(kāi)通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問(wèn)快、穩(wěn)定!
文章題目:Linux如何設(shè)置進(jìn)程的父進(jìn)程(linux設(shè)置父進(jìn)程)
文章網(wǎng)址:http://m.fisionsoft.com.cn/article/djgdgdd.html


咨詢
建站咨詢
