linux重啟進程腳本
1. linux中如何重啟某一進程
1、首先使用ps -ef查找進程的執行語句並保留它;這個的目的是保留進程執行的參數不變;
例如重啟單個mongodb的過程:
查找:ps -ef|grep mongod
獲得:
root 2928 2903 0 14:51 pts/0 00:00:00 grep /usr/local/mongodb/bin/mongod --config /etc/mongodb.cnf
2、使用kill -9 PID殺掉該進程;
kill -9 2928
3、使用保留的進程語句重啟進程;
/usr/local/mongodb/bin/mongod --config /etc/mongodb.cnf
2. Linux進程詳解
ps是Linux 中最基礎的瀏覽系統中的進程的命令。能列出系統中運行的進程,包括進程號、命令、CPU使用量、內存使用量等。接下來解讀一下Linux操作系統的進程和Windows「Ctrl+Alt+delete」直接的差異。
在進行了解進程命令之前需要知道進程的一些狀態
ps工具標識進程的5種狀態碼:
Linux操作系統進程執行的狀態轉換圖如圖所示:
下面來看一下 ps命令
ps --help命令可以查看ps命令的使用說明
或者使用 man ps命令 查詢ps的詳細說明
在 man手冊 關於ps的解讀中,總結了一下幾個參數的含義:
以上的參數是可以拼接使用的,那就了解一些常用的參數組合
ps aux命令
ps -ef命令
查看進程狀態這兩個是命令是最常用的,使用 ps aux 可以查看進程的詳細運行狀態等。使用 ps -ef 不僅可以顯示自身的PID,也可以顯示PPID(父進程)。但是顯示不了進程的運行狀態
top命令
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器
man手冊關於top的解釋
關閉進程,重啟進程
在上一片文章中 linux的目錄結構 裡面說過,在目錄/etc/init.d/目錄下包含許多系統各種服務的啟動和停止腳本。假設進程佔用內存較大或者進程異常,我們是重啟這個進程restart。如下圖所示:
我們重啟了mysqld這個進程,可以看出進程號已經改變(從15743到15964),說明進程已經重啟。
Linux下有3個特殊的進程,idle進程(PID=0), init進程(PID=1)和kthreadd(PID=2)
我們來看一下進程狀態[下面是刪減版,進程數量太多,列舉一部分]
可以看到很多進程的PPID號是1和2。也就是init進程和kthreadd進程。
在使用Windows系統的過程中,都碰到過應用程序卡死的情況。應對此問題,我們一般都是等待失去響應的程序恢復,或者是直接使用任務管理器將其強制關閉,然後再重新打開。
在Linux中,遇到特別耗費資源的進程,當然需要使用 top命令 查看進程佔用率高的進程。或者使用 free -m命令 查看內存剩餘。假設需要強殺進程來釋放空間。我們涉及到Linux中信號📶的知識,在這里簡單的描述一下,信號的詳解會在接下來的文章裡面敘述。
free -m命令查看內存空間
在linux中存在著64種信號
使用 kill -l命令 查看信號列表
在前面說過進程會被這些個信號> (進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號強制停止運行) 那問題就在於如何發信號給這些個進程。
使用kill命令發信號
我們從上面可以看到 mysqld進程被重啟了 。
關於Linux的這一塊進程的知識還有很多,後面的文章跟大家分享僵屍進程,孤兒進程等等知識,以及守護進程(daemon進程).
3. 幫忙寫個linux(ubuntu)下程序自動重啟的腳本
你好!~我寫了一個!~你可以試試,內存只知道查詢使用百分比,你可以按照你的總內存乘一下,把變數PRO換成你的fcitx,SIZE換成你算出來的內存大小,kill下再寫一行你的程序啟動的命令(我沒用過你那個軟體,不知道怎麼啟動),應該就可以了。水平有限,歡迎指出不足
#!/bin/bash
#
PRO="pro"
MEM=$(ps aux | grep pro | grep -v 'grep' | awk '{print $4}')
PID=$(ps aux | grep pro | grep -v 'grep' | awk '{print $2}')
declare -i SIZE=8
if [[ $MEM > $SIZE ]] ; then
kill -9 $PID
fi
4. Linux進程管理及作業控制的啟動進程
鍵入需要運行的程序的程序名,執行一個程序,其實也就是啟動了一個進程。在Linux系統中每個進程都具有一個進程號,用於系統識別和調度進程。啟動一個進程有兩個主要途徑:手工啟動和調度啟動,後者是事先進行設置,根據用戶要求自行啟動。 由用戶輸入命令,直接啟動一個進程便是手工啟動進程。但手工啟動進程又可以分為很多種,根據啟動的進程類型不同、性質不同,實際結果也不一樣,下面分別介紹。
1. 前台啟動
這或許是手工啟動一個進程的最常用的方式。一般地,用戶鍵入一個命令「ls –l」,這就已經啟動了一個進程,而且是一個前台的進程。這時候系統其實已經處於一個多進程狀態。或許有些用戶會疑惑:我只啟動了一個進程而已。但實際上有許多運行在後台的、系統啟動時就已經自動啟動的進程正在悄悄運行著。還有的用戶在鍵入「ls –l」命令以後趕緊使用「ps –x」查看,卻沒有看到ls進程,也覺得很奇怪。其實這是因為ls這個進程結束太快,使用ps查看時該進程已經執行結束了。如果啟動一個比較耗時的進程:
find / -name fox.jpg
然後再把該進程掛起,使用ps查看,就會看到一個find進程在裡面。
2. 後台啟動
直接從後台手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且用戶也不急著需要結果的時候。假設用戶要啟動一個需要長時間運行的格式化文本文件的進程。為了不使整個shell在格式化過程中都處於「癱瘓」狀態,從後台啟動這個進程是明智的選擇。
[例1]
$ troff –me notes > note_form &
[1] 4513
$
由上例可見,從後台啟動進程其實就是在命令結尾加上一個&號。鍵入命令以後,出現一個數字,這個數字就是該進程的編號,也稱為PID,然後就出現了提示符。用戶可以繼續其他工作。
上面介紹了前、後台啟動的兩種情況。實際上這兩種啟動方式有個共同的特點,就是新進程都是由當前shell這個進程產生的。也就是說,是shell創建了新進程,於是就稱這種關系為進程間的父子關系。這里shell是父進程,而新進程是子進程。一個父進程可以有多個子進程,一般地,子進程結束後才能繼續父進程;當然如果是從後台啟動,那就不用等待子進程結束了。
一種比較特殊的情況是在使用管道符的時候。例如:
nroff -man ps.1|grep kill|more
這時候實際上是同時啟動了三個進程。請注意是同時啟動的,所有放在管道兩邊的進程都將被同時啟動,它們都是當前shell的子程序,互相之間可以稱為兄弟進程。
以上介紹的是手工啟動進程的一些內容,作為一名系統管理員,很多時候都需要把事情安排好以後讓其自動運行。因為管理員不是機器,也有離開的時候,所以有些必須要做的工作而恰好管理員不能親自操作,這時候就需要使用調度啟動進程了。 有時候需要對系統進行一些比較費時而且佔用資源的維護工作,這些工作適合在深夜進行,這時候用戶就可以事先進行調度安排,指定任務運行的時間或者場合,到時候系統會自動完成這一切工作。
要使用自動啟動進程的功能,就需要掌握以下幾個啟動命令。
at命令
用戶使用at命令在指定時刻執行指定的命令序列。也就是說,該命令至少需要指定一個命令、一個執行時間才可以正常運行。at命令可以只指定時間,也可以時間和日期一起指定。需要注意的是,指定時間有個系統判別問題。比如說:用戶現在指定了一個執行時間:凌晨3:20,而發出at命令的時間是頭天晚上的20:00,那麼究竟是在哪一天執行該命令呢?如果用戶在3:20以前仍然在工作,那麼該命令將在這個時候完成;如果用戶3:20以前就退出了工作狀態,那麼該命令將在第二天凌晨才得到執行。下面是at命令的語法格式:
at [-V] [-q 隊列] [-f 文件名] [-mldbv] 時間
at -c 作業 [作業...]
at允許使用一套相當復雜的指定時間的方法,實際上是將POSIX.2標准擴展了。它可以接受在當天的hh:mm(小時:分鍾)式的時間指定。如果該時間已經過去,那麼就放在第二天執行。當然也可以使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的詞語來指定時間。用戶還可以採用12小時計時制,即在時間後面加上AM(上午)或者PM(下午)來說明是上午還是下午。
也可以指定命令執行的具體日期,指定格式為month day(月 日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
上面介紹的都是絕對計時法,其實還可以使用相對計時法,這對於安排不久就要執行的命令是很有好處的。指定格式為:now + count time-units ,now就是當前時間,time-units是時間單位,這里可以是 minutes(分鍾)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。
還有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。下面通過一些例子來說明具體用法。
[例2] 指定在今天下午5:30執行某命令。假設現在時間是中午12:30,1999年2月24日,其命令格式如下:
at 5:30pm
at 17:30
at 17:30 today
at now + 5 hours
at now + 300 minutes
at 17:30 24.2.99
at 17:30 2/24/99
at 17:30 Feb 24
以上這些命令表達的意義是完全一樣的,所以在安排時間的時候完全可以根據個人喜好和具體情況自由選擇。一般採用絕對時間的24小時計時法可以避免由於用戶自己的疏忽造成計時錯誤的情況發生,例如上例可以寫成:
at 17:30 2/24/99
這樣非常清楚,而且別人也看得懂。
對於at命令來說,需要定時執行的命令是從標准輸入或者使用-f選項指定的文件中讀取並執行的。如果at命令是從一個使用su命令切換到用戶shell中執行的,那麼當前用戶被認為是執行用戶,所有的錯誤和輸出結果都會送給這個用戶。但是如果有郵件送出的話,收到郵件的將是原來的用戶,也就是登錄時shell的所有者。
[例3]
$ at -f work 4pm + 3 days
在三天後下午4點執行文件work中的作業。
$ at -f work 10am Jul 31
在7月31日上午10點執行文件work中的作業。
在任何情況下,超級用戶都可以使用這個命令。對於其他用戶來說,是否可以使用就取決於兩個文件:/etc/at.allow和/etc/at.deny。如果/etc/at.allow文件存在的話,那麼只有在其中列出的用戶才可以使用at命令;如果該文件不存在,那麼將檢查/etc/at.deny文件是否存在,在這個文件中列出的用戶均不能使用該命令。如果兩個文件都不存在,那麼只有超級用戶可以使用該命令;空的/etc/at.deny文件意味著所有的用戶都可以使用該命令,這也是默認狀態。
下面對命令中的參數進行說明。
-V 將標准版本號列印到標准錯誤中。
-q queue 使用指定的隊列。隊列名稱是由單個字母組成,合法的隊列名可以由a-z或者A-Z。a隊列是at命令的默認隊列。
-m 作業結束後發送郵件給執行at命令的用戶。
-f file 使用該選項將使命令從指定的file讀取,而不是從標准輸入讀取。
-l atq命令的一個別名。該命令用於查看安排的作業序列,它將列出用戶排在隊列中的作業,如果是超級用戶,則列出隊列中的所有工作。
命令的語法格式如下:
atq [-V] [-q 隊列] [-v]
-d atrm 命令的一個別名。該命令用於刪除指定要執行的命令序列,語法格式如下:
atrm [-V] 作業 [作業...]
-c 將命令行上所列的作業送到標准輸出。
[例4] 找出系統中所有以txt為後綴名的文件,並且進行列印。列印結束後給用戶foxy發出郵件通知取件。指定時間為十二月二十五日凌晨兩點。
首先鍵入:
$ at 2:00 12/25/99
然後系統出現at>提示符,等待用戶輸入進一步的信息,也就是需要執行的命令序列:
at> find / -name 「*.txt」|lpr
at> echo 「foxy:All texts have been printed.You can take them over.Good day!River」 |mail -s 」job done」 foxy
輸入完每一行指令然後回車,所有指令序列輸入完畢後,使用組合鍵結束at命令的輸入。這時候屏幕將出現如下信息:
warning:command will be executed using /bin/sh.
job 1 at 1999-12-25 02:00
提醒用戶將使用哪個shell來執行該命令序列。 實際上如果命令序列較長或者經常被執行的時候,一般都採用將該序列寫到一個文件中,然後將文件作為at命令的輸入來處理。這樣不容易出錯。
例5] 上面的例子可以修改如下:
將命令序列寫入到文件/tmp/printjob,語句為:
$ at -f /tmp/printjob 2:00 12/25/99
這樣一來,at命令將使用文件中的命令序列,屏幕顯示如下:
Warning:command will be executed using /bin/sh.
job 2 at 1999-12-25 02:00
當然也可以採用以下命令:
$ at< /tmp/printjob 2:00 12/25/99
來完成同樣的任務。也就是使用輸入重定向的辦法將文件定向為命令輸入。
batch命令
batch 用低優先順序運行作業,該命令幾乎和at命令的功能完全相同,唯一的區別在於,at命令是在指定時間,很精確的時刻執行指定命令;而batch卻是在系統負載較低,資源比較空閑的時候執行命令。該命令適合於執行佔用資源較多的命令。
batch命令的語法格式也和at命令十分相似,即
batch [-V] [-q 隊列] [-f 文件名] [-mv] [時間]
具體的參數解釋請參考at命令。一般地說,不用為batch命令指定時間參數,因為batch本身的特點就是由系統決定執行任務的時間,如果用戶再指定一個時間,就失去了本來的意義。
[例6] 使用例4,鍵入:
$ batch
at> find / -name *.txt|lpr
at> echo 「foxy:All texts have been printed.You can take them over.Good day!River」 |mail -s 」job done」 foxy
現在這個命令就會在合適的時間進行了,進行完後會發回一個信息。
仍然使用組合鍵來結束命令輸入。而且batch和at命令都將自動轉入後台,所以啟動的時候也不需要加上&符號。
cron命令
前面介紹的兩條命令都會在一定時間內完成一定任務,但是要注意它們都只能執行一次。也就是說,當指定了運行命令後,系統在指定時間完成任務,一切就結束了。但是在很多時候需要不斷重復一些命令,比如:某公司每周一自動向員工報告頭一周公司的活動情況,這時候就需要使用cron命令來完成任務了。
實際上,cron命令是不應該手工啟動的。cron命令在系統啟動時就由一個shell腳本自動啟動,進入後台(所以不需要使用&符號)。一般的用戶沒有運行該命令的許可權,雖然超級用戶可以手工啟動cron,不過還是建議將其放到shell腳本中由系統自行啟動。
首先cron命令會搜索/var/spool/cron目錄,尋找以/etc/passwd文件中的用戶名命名的crontab文件,被找到的這種文件將載入內存。例如一個用戶名為foxy的用戶,它所對應的crontab文件就應該是/var/spool/cron/foxy。也就是說,以該用戶命名的crontab文件存放在/var/spool/cron目錄下面。cron命令還將搜索/etc/crontab文件,這個文件是用不同的格式寫成的。
cron啟動以後,它將首先檢查是否有用戶設置了crontab文件,如果沒有就轉入「休眠」狀態,釋放系統資源。所以該後台進程佔用資源極少。它每分鍾「醒」過來一次,查看當前是否有需要運行的命令。命令執行結束後,任何輸出都將作為郵件發送給crontab的所有者,或者是/etc/crontab文件中MAILTO環境變數中指定的用戶。
上面簡單介紹了一些cron的工作原理,但是cron命令的執行不需要用戶干涉;需要用戶修改的是crontab中要執行的命令序列,所以下面介紹crontab命令。
crontab命令
crontab命令用於安裝、刪除或者列出用於驅動cron後台進程的表格。也就是說,用戶把需要執行的命令序列放到crontab文件中以獲得執行。每個用戶都可以有自己的crontab文件。下面就來看看如何創建一個crontab文件。
在/var/spool/cron下的crontab文件不可以直接創建或者直接修改。crontab文件是通過crontab命令得到的。現在假設有個用戶名為foxy,需要創建自己的一個crontab文件。首先可以使用任何文本編輯器建立一個新文件,然後向其中寫入需要運行的命令和要定期執行的時間。
然後存檔退出。假設該文件為/tmp/test.cron。再後就是使用crontab命令來安裝這個文件,使之成為該用戶的crontab文件。鍵入:
crontab test.cron
這樣一個crontab 文件就建立好了。可以轉到/var/spool/cron目錄下面查看,發現多了一個foxy文件。這個文件就是所需的crontab 文件。用more命令查看該文件的內容可以發現文件頭有三行信息:
#DO NOT EDIT THIS FILE -edit the master and reinstall.
#(test.cron installed on Mon Feb 22 14:20:20 1999)
#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
大概意思是:
#切勿編輯此文件——如果需要改變請編輯源文件然後重新安裝。
#test.cron文件安裝時間:14:20:20 02/22/1999
如果需要改變其中的命令內容時,還是需要重新編輯原來的文件,然後再使用crontab命令安裝。
可以使用crontab命令的用戶是有限制的。如果/etc/cron.allow文件存在,那麼只有其中列出的用戶才能使用該命令;如果該文件不存在但cron.deny文件存在,那麼只有未列在該文件中的用戶才能使用crontab命令;如果兩個文件都不存在,那就取決於一些參數的設置,可能是只允許超級用戶使用該命令,也可能是所有用戶都可以使用該命令。
crontab命令的語法格式如下:
crontab [-u user] file
crontab [-u user]{-l|-r|-e}
第一種格式用於安裝一個新的crontab 文件,安裝來源就是file所指的文件,如果使用「-」符號作為文件名,那就意味著使用標准輸入作為安裝來源。
-u 如果使用該選項,也就是指定了是哪個具體用戶的crontab 文件將被修改。如果不指定該選項,crontab 將默認是操作者本人的crontab ,也就是執行該crontab 命令的用戶的crontab 文件將被修改。但是請注意,如果使用了su命令再使用crontab 命令很可能就會出現混亂的情況。所以如果是使用了su命令,最好使用-u選項來指定究竟是哪個用戶的crontab文件。
-l 在標准輸出上顯示當前的crontab。
-r 刪除當前的crontab文件。
-e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab文件。當結束編輯離開時,編輯後的文件將自動安裝。
[例7]
# crontab -l #列出用戶目前的crontab。
10 6 * * * date
0 */2 * * * date
0 23-7/2,8 * * * date
#
在crontab文件中如何輸入需要執行的命令和時間。該文件中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。每個域之間使用空格或者製表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
第一項是分鍾,第二項是小時,第三項是一個月的第幾天,第四項是一年的第幾個月,第五項是一周的星期幾,第六項是要執行的命令。這些項都不能為空,必須填入。如果用戶不需要指定其中的幾項,那麼可以使用*代替。因為*是統配符,可以代替任何字元,所以就可以認為是任何時間,也就是該項被忽略了。在表4-1中給出了每項的合法范圍。
表4-1指定時間的合法范圍
時間
合法值
minute 00-59
hour 00-23,其中00點就是晚上12點
day-of-month
01-31
month-of-year
01-12
day-of-week
0-6,其中周日是0
這樣用戶就可以往crontab 文件中寫入無限多的行以完成無限多的命令。命令域中可以寫入所有可以在命令行寫入的命令和符號,其他所有時間域都支持列舉,也就是域中可以寫入很多的時間值,只要滿足這些時間值中的任何一個都執行命令,每兩個時間值中間使用逗號分隔。
[例8]
5,15,25,35,45,55 16,17,18 * * * command
這就是表示任意天任意月,其實就是每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。
[例9]
在每周一,三,五的下午3:00系統進入維護狀態,重新啟動系統。那麼在crontab 文件中就應該寫入如下欄位:
00 15 * * 1,3,5 shutdown -r +5
然後將該文件存檔為foxy.cron,再鍵入crontab foxy.cron安裝該文件。
[例10]
每小時的10分,40分執行用戶目錄下的innd/bbslin這個指令:
10,40 * * * * innd/bbslink
[例11]
每小時的1分執行用戶目錄下的bin/account這個指令:
1 * * * * bin/account
[例12]
每天早晨三點二十分執行用戶目錄下如下所示的兩個指令(每個指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire>expire.1st)
[例13]
每年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果添加在mm.txt這個文件之後(mm.txt文件位於用戶自己的目錄位置)。
12,55 3 4-9 1,4 * /bin/rm -f expire.1st>> m.txt
[例14]
我們來看一個超級用戶的crontab文件:
#Run the 『atrun』 program every minutes
#This runs anything that』s e to run from 『at』.See man 『at』 or 『atrun』. 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
40 7 * * * updatedb
8,10,22,30,39,46,54,58 * * * * /bin/sync
進程的掛起及恢復命令bg、fg
作業控制允許將進程掛起並可以在需要時恢復進程的運行,被掛起的作業恢復後將從中止處開始繼續運行。只要在鍵盤上按,即可掛起當前的前台作業。
[例15]
$ cat >
< ctrl+z>
text.file [1] + stopped cat > text.file
$ jobs [1]+ stopped cat >text.file
在鍵盤上按後,將掛起當前執行的命令cat。使用jobs命令可以顯示shell的作業清單,包括具體的作業、作業號以及作業當前所處的狀態。
恢復進程執行時,有兩種選擇:用fg命令將掛起的作業放回到前台執行;用bg命令將掛起的作業放到後台執行。
[例16]
用戶正在使用Emacs,突然需要查看系統進程情況。就首先使用組合鍵將Emacs進程掛起,然後使用bg命令將其在後台啟動,這樣就得到了前台的操作控制權,接著鍵入「ps –x」查看進程情況。查看完畢後,使用fg命令將Emacs帶回前台運行即可。其命令格式為:
< ctrl+z>
$ bg emacs
$ ps –x
$ fg emacs
默認情況下,fg和bg命令對最近停止的作業進行操作。如果希望恢復其他作業的運行,可以在命令中指定要恢復作業的作業號來恢復該作業。例如:
$ fg 1
cat > text.file
靈活使用上述命令,將給自己帶來很大的方便。
5. linux開機自動執行命令和腳本 自動啟動 自啟 進程一直運行
原文及更新: https://neucrack.com/p/91
直接在/etc/rc.local(/etc/rc.d/rc.local)文件中添加即可
上面這腳本實際上在使用時出現了問題, /home/neucrack/software/ss/start_ss_local.sh 這個命令始終沒有被執行,原因是 /home/neucrack/software/ss/start_kcptun_client.sh 中的命令阻塞了進程,導致後面一句始終沒有執行,可以將他們分別放到後台執行就行了,如何在後台執行可以看文章最後一部分
也可以自己手動在rc*.d中建立軟連接
桌面系統搜索 啟動 ,打開啟動管理器 添加刪除即可
一般有以下幾種方法:
1)在輸入命令的最前面加上 nohup 命令
如 nohup your_command & 這樣命令在你退出後仍然會在後台執行
2) setsid 命令
setsid your_command 該命令的結果是使你所運行的命令的父進程為init,所以只有關機該進程才會停止
3) (your_command &)
就是用括弧將你的命令括起來,這樣做也是使命令的父進程為init
4) disown
當你在命令行下輸入 your_command & 後命令就在後台執行了,然後執行jobs命令,該命令會列出當前正在後台執行的命令。例如輸入命令「top&」
然後執行"jobs"
輸出結果是
[1] + Suspended (tty output) top
注意行開頭方括弧內的數字,該數字叫做jobspec,是給當前後台運行的job的編號。這是你只要在命令行下輸入"disown -h 1" 後台運行的top命令就不會受到hangup信號的影響了。
5)使用 screen 命令
在命令行下輸入screen命令就開啟了一個screen進程,它就好像是一個全新的命令運行環境,在該環境中你可以像在正常的terminal下那樣執行
命令,但是這個screen是不受其父進程的hangup信號的影響的,既然screen不受其父進程影響,當你意外掉線或者退出系統時,在screen
中仍在執行的命令仍然會繼續執行。關於screen命令的使用方法你可以再去查閱相關資料。
6. LINUX如何實現進程殺死後重新啟動
HOHO相當有難度的問題。
首先,我想知道的是如何叫意外殺死,一切沒有執行完的都算是意外殺死么?我看用shell解決是比較合適的。大致流程如下:
首先我希望你有1234的源代碼,因為我不知道你所謂的意外殺死是什麼情況下意外殺死,比如通過kill來發送信號殺死他。請注意,如果你程序執行出現異常也是通過信號來殺死,不過是內核發送的,而不是你自己來發送的。所以我希望你修改1234的源代碼,在他正常結束的情況下,你最好有個輸出標志標識他正常結束。比如你的程序是C寫的,那麼希望你在正常結束後調用一個printf("success end");這個應該不難。
緊接著,你寫一個shell腳本,這個腳本應該是這樣
絕對路徑/1234 > 絕對路徑/my.txt,以後想啟動這個進程就用這個腳本來啟動。
在希望你寫一個腳本,這個腳本執行ps -le首先查看進程裡面是否還存在1234這個進程,如果有就什麼都不做退出,如果沒有了,那你就檢查my.txt文件看是否是正常結束了,如果正常結束就從cron守護進程的配置文件移除我這個檢測腳本。如果沒有找到 success end的話,那麼就再次啟動。
最後將這個腳本加到cron守護進程的配置文件中,定時啟動它檢測。
有點麻煩,不過這是我能想到的辦法了,也許其它人有更好的辦法。
7. Linux如何啟動流程Linux啟動流程詳解
當用戶打開電源後,BIOS開機自檢,確定啟動設備,安裝啟動設備,啟動設備上面安裝的GRUB開始引導Linux,Linux首先先進行內核引導,通過跟切換,執行init程序,init程序確定啟動級別,根據啟動級別進行系統初始化和運行的服務,然後返回init啟動終端,用戶通過驗證成功登陸Shell,這就是一個從開機到登陸的啟動過程。
一、硬體引導啟動
當用戶打開電源後POST開始自檢,檢測硬體設備是否確實或者存在故障(是否影響正常開機),如果不影響正常開機,就把任務交給BIOS。BIOS通過搜索,安裝啟動確定啟動設備,啟動項為硬碟,BIOS去讀取硬碟的前512位元組到內存,找到BootLoader,確定GRUB
二、GRUB引導啟動內核
這一部分概況起來就是:GRUB程序載入執行並開始引導kernel程序
Boot Loader就是在操作系統內核運行之前運行的一小段程序。通過GRUB引導可以確定內核程序,因為引導扇區只有446位元組,GRUB只是一個小的程序安裝在裡面,真正使用的在MBR後面的扇區存放,我們想使用Bootloader GRUB功能必須讀取後面的文件,Bootloader GRUB功能程序的運行和載入配置選項分為三個階段
Stage1階段:
Stage1階段其實就是執行系統安裝時預先寫入到MBR的Bootloader中的程序。
Stage1階段的任務僅是將硬碟0柱面0磁軌2扇區的內容讀入內存並執行,它是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。 在此Stage1階段,還沒有識別文件系統的能力。
Stage1.5階段:
stage1.5階段是stage1階段和stage2階段的中間橋梁。stage1.5階段具有識別啟動分區文件系統的能力,此後GRUB程序便有能力去訪問/boot分區下/grub目錄下的 stage2文件,並將stage2載入內存執行。
Stage2階段
Stage2階段執行時,首先會解析GRUB程序的配置文件grub.conf,並依配置文件決定是否顯示系統啟動菜單。然後載入內核鏡像到內存中,通過initrd程序建立RAMDisk內存虛擬根文件系統。此時控制權將轉交給內核程序。
三、內核引導啟動
這一部分主要是通過在內存中建立虛擬根文件系統實現相關設備的驅動並建立和切換到真正的根文件系統。
解壓內核鏡像載入到內存,以及initrd程序建立RAMDisk內存虛擬根文件系統後,內核開始驅動基本硬體,並調用虛擬根文件系統中的init程序載入驅動模塊初始化系統中各種設備的相關配置工作,其中包括CPU、I/O、存儲設備等。當所需的驅動程序載入完後,會根據grub.conf配置文件中「root=XXX」部分所指定的內容創建一個根設備,然後將根文件系統以只讀的方式掛載,並切換到真正的根文件系統上,同時調用系統進程的/sbin/init程序,進入系統初始化階段。
四、系統初始化
這一步是通過/sbin/init,init程序准備軟體運行壞境,啟動系統服務
通過/etc/inittab文件確定運行級別,然後去執行系統初始化腳本/etc/rc.sysinit,為用戶初始化用戶空間環境,在完成初始化後,根據運行級別,系統開始對應級別的目錄啟動服務,關閉那些不要的服務(裡面S99local -> ../rc.local)用戶自動服務啟動腳本
運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網路功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別:3, 5
切換級別:init #
查看級別:runlevel ; who -r
五、啟動終端,用戶登錄
這一步是用戶登錄shell過程
如果沒有改變級別,默認情況執行/sbin/mingetty打開6個純文本終端,讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,核對密碼。如果密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,然後啟動這個shell。更多Linux介紹請查看《Linux就該這么學》。
8. 如何重啟伺服器服務 linux
Linux有如下的關機和重啟命令:shutdown, reboot, halt, poweroff
shutdown - 建議使用的命令
shutdown是最常用也是最安全的關機和重啟命令,它會在關機之前調用fsck檢查磁碟,其中-h和-r是最常用的參數:
-h:停止系統服務並關機 -r: 停止系統服務後重啟 更詳細的命令介紹可查看」Linux命令大全「