當前位置:首頁 » 操作系統 » linuxshell實現

linuxshell實現

發布時間: 2022-08-02 07:44:25

『壹』 linux前台進程獨佔shell是怎麼實現的

Linux中的kill命令用來終止指定的進程(terminate a process)的運行,是Linux下進程管理的常用命令。通常,終止一個前台進程可以使用Ctrl+C鍵,但是,對於一個後台進程就須用kill命令來終止,我們就需要先使用ps/pidof/pstree/top等工具獲取進程PID,然後使用kill命令來殺掉該進程。kill命令是通過向進程發送指定的信號來結束相應進程的。在默認情況下,採用編號為15的TERM信號。TERM信號將終止所有不能捕獲該信號的進程。對於那些可以捕獲該信號的進程就要用編號為9的kill信號,強行「殺掉」該進程。
1.命令格式:
kill[參數][進程號]
2.命令功能:
發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果任無法終止該程序可用「-KILL」 參數,其發送的信號為SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。
3.命令參數:
-l 信號,若果不加信號的編號參數,則使用「-l」參數會列出全部的信號名稱
-a 當處理當前進程時,不限制命令名和進程號的對應關系
-p 指定kill 命令只列印相關進程的進程號,而不發送任何信號
-s 指定發送信號
-u 指定用戶
注意:
1、kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的信號。例如:
kill -2 123
它的效果等同於在前台運行PID為123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。
2、kill可以帶有進程ID號作為參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有許可權撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。
3、可以向多個進程發信號或終止它們。
4、當kill成功地發送了信號後,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下Enter鍵使shell的命令提示符再次出現時,才會顯示出來。
5、應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號(9),因為進程不能首先捕獲它。要撤銷所有的後台作業,可以輸入kill 0。因為有些在後台運行的命令會啟動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啟動的進程,是個有效的方法。
4.使用實例:
實例1:列出所有信號名稱
命令:
kill -l
輸出:
[root@localhost test6]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
說明:
只有第9種信號(SIGKILL)才可以無條件終止進程,其他信號進程都有權利忽略。 下面是常用的信號:
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)
實例2:得到指定信號的數值
命令:
輸出:
[root@localhost test6]# kill -l KILL
9[root@localhost test6]# kill -l SIGKILL
9[root@localhost test6]# kill -l TERM
15[root@localhost test6]# kill -l SIGTERM
15[root@localhost test6]#
說明:
實例3:先用ps查找進程,然後用kill殺掉
命令:
kill 3268
輸出:
[root@localhost test6]# ps -ef|grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
[root@localhost test6]# kill 3268
[root@localhost test6]# kill 3268
-bash: kill: (3268) - 沒有那個進程
[root@localhost test6]#
說明:
實例4:徹底殺死進程
命令:
kill –9 3268
輸出:
[root@localhost test6]# ps -ef|grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
[root@localhost test6]# kill –9 3268
[root@localhost test6]# kill 3268
-bash: kill: (3268) - 沒有那個進程
[root@localhost test6]#
說明:
實例5:殺死指定用戶所有進程
命令:
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux
輸出:
[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux)
[root@localhost ~]# kill -u peidalinux
說明:
方法一,過濾出hnlinux用戶進程並殺死
實例6:init進程是不可殺的
命令:
kill -9 1
輸出:
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17563 17534 0 17:37 pts/1 00:00:00 grep init
[root@localhost ~]# kill -9 1
[root@localhost ~]# kill -HUP 1
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17565 17534 0 17:38 pts/1 00:00:00 grep init
[root@localhost ~]# kill -KILL 1
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17567 17534 0 17:38 pts/1 00:00:00 grep init
[root@localhost ~]#
說明:
init是Linux系統操作中不可缺少的程序之一。所謂的init進程,它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啟動一個用戶級程序init的方式,完成引導進程。所以,init始終是第一個進程(其進程編號始終為1)。 其它所有進程都是init進程的子孫。init進程是不可殺的!
,

『貳』 用shell實現一個在Linux環境下運行的命令行工具

自己編程實現一個shell?stupidShell

『叄』 linux 編寫一個shell腳本文件,實現以下功能

#!/bin/bash
whiletrue
do
cat<<END
啟動Apache(a)
啟動Mysql(m)
啟動Samba(s)
啟動ftp(f)
啟動DNS(d)
退出腳本(E)
END
read-p"請輸入要執行的操作:"choice
case$choicein
a)
servicehttpdstart
;;
m)
servicemysqldstart
;;
s)
servicesambastart
;;
f)
servicevsftpdstart
;;
d)
servicenamedstart
;;
E)
exit
;;
*)
echo"輸入有誤,請輸入字母a/m/s/f/d啟動相應的服務!"
;;
esac
done

這是模板,純手打。其中的service httpd start之類的可以換成具體的命令,也可以加上if判斷。

針對按什麼鍵執行什麼操作用case判斷最方便

其中

a)的意思是如果$choice等於a的話則執行什麼什麼

m)的意思是如果$choice等於m的話則之姓什麼什麼

其餘同理

*)的意思是如果沒有以上的a) m) f)...的話就會匹配到這一行,就會輸出:輸入有誤,請輸入字母a/m/s/f/d啟動相應的服務。

read -p "請輸入要執行的操作:" choice //這是個互動式的命令,會輸出"請輸入要執行的操"作到顯示器上,然後將你輸入的值賦值給變數choice 然後再用case判斷變數choice。

if判斷也可以。根據個人喜好來。

case xxx in

x)

;;

y)

;;

*)

;;

這是語法。

『肆』 linux下shell如何實現以下功能

Linux中增加軟路由的兩種方法
第一種:
route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.254 dev eth0
/* 增加一條網路172.16.6.0/24 經過172.16.2.254 eth0 */
/* -net增加網路 -host增加主機 netmask 子網掩碼 gw 網關 dev 裝置,設備,這里是你的網卡名*/
route del gw 172.16.2.254 /* 刪除默認網關172.16.2.254 */
route del -net 172.16.86.0/24 /* 刪除默認網路172.16.86.0 */
route /* 顯示當前路由表 */
常用的是這種方式,但有時你在刪除或一條軟路由時會不起作用,會有什麼提示:
SIOCADDRT: 無法接觸網路
所以這時用如下的這種方法就可以了
第二種:
實現的功能和上面的一樣
ip route add 172.16.6.0/24 via 172.16.2.254 dev eth0
ip route del gw 172.16.2.254
ip route del 172.16.6.0/24 dev eth0
ip route

刪除的方法:
添加路由:
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
刪除路由:
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth0
添加默認路由:
route add default gw 10.0.0.1
刪除默認路由:
route del default gw 10.0.0.1
或者
route del default

---------------------------------------------------------------------------------------
linux下添加路由的方法:
一:使用 route 命令添加
使用route 命令添加的路由,機器重啟或者網卡重啟後路由就失效了,方法:
//添加到主機的路由
# route add –host 192.168.168.110 dev eth0
# route add –host 192.168.168.119 gw 192.168.168.1
//添加到網路的路由
# route add –net IP netmask MASK eth0
# route add –net IP netmask MASK gw IP
# route add –net IP/24 eth1
//添加默認網關
# route add default gw IP
//刪除路由
# route del –host 192.168.168.110 dev eth0
二:在linux下設置永久路由的方法:
1.在/etc/rc.local里添加
方法:
route add -net 192.168.3.0/24 dev eth0
route add -net 192.168.2.0/24 gw 192.168.3.254
2.在/etc/sysconfig/network里添加到末尾
方法:GATEWAY=gw-ip 或者 GATEWAY=gw-dev
3./etc/sysconfig/static-router :
any net x.x.x.x/24 gw y.y.y.y

『伍』 linux shell 如何實現浮點運算

linux shell本身只是一個腳本語言,使用操作系統的命令或已安裝的程序進行運算。你出的題咋一看有難度,實際上是個偽命題,只要有個已經安裝好的支持高精度浮點運算的支持外部調用的計算器程序,寫個shell實現這個命題太簡單了。如果只是依賴操作系統內置的計算器,那就復雜很多。需要考慮把數字轉成文本,進行截斷後,再轉成數字,分段進行計算,然後再將結果進行組合,最終結果需要以文本方式輸出,理論上也可以實現。

『陸』 在linux中如何在代碼中實現shell中實現的功能

(1)建立一個目錄 mkdir -p /var/run/fruinfo/
(2)新建並編輯這個文件 /var/run/fruinfo/LCHAS
文件裡面寫入N,這個N每次都不同,可以在執行腳本時候定義,然後保存退出
(3)建立一個目錄 mkdir -p /var/run/frus/
(4)新建編輯這個文件 /var/run/frus/slot
文件裡面寫入X,這個X每次都不同,可以在執行腳本時候定義,然後保存退出

『柒』 Linux:用shell如何實現讀取一個字元串的第n個字元呢

代碼如下:

str="/home/gateman"

if [ ${str:0:1} = "/" ]; then

echo "yes'

fi

${str:0:1} 中0表示從第幾個字元開始,1表示截取多長。

Shell是一種腳本語言,那麼,就必須有解釋器來執行這些腳本,常見的腳本解釋器有:

bash:是Linux標准默認的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。

sh:由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標准默認的shell。

另外還有:ash、 csh、 ksh等。

(7)linuxshell實現擴展閱讀

Linux shell 截取字元變數的前8位:

實現方法有如下幾種:

expr substr 「$a」 1 8

echo $a|awk 『{print substr(,1,8)}』

echo $a|cut -c1-8

echo $

expr $a : 『(.\).*』

echo $a|dd bs=1 count=8 2>/dev/null

按照指定要求分割:

比如獲取後綴名

ls -al | cut -d 「.」 -f2

小結:shell對應字元串的處理方法很多,根據需求靈活選擇。

在做shell批處理程序時候,經常會涉及到字元串相關操作。有很多命令語句,如:awk,sed都可以做字元串各種操作。 其實shell內置一系列操作符號,可以達到類似效果,大家知道,使用內部操作符會省略啟動外部程序等時間,因此速度會非常的快。

『捌』 幫忙在linux採用shell腳本來實現一些功能

sed 's/ABCD1/ABCD2/g' <filename> > <filename>

把上述這句話,放在/etc/bashrc 最後那裡。

『玖』 Linux下如何實現shell多線程編程以提高應用程序的響應

Linux中多線程編程擁有提高應用程序的響應、使多cpu系統更加有效等優點,下面小編將通過Linux下shell多線程編程的例子給大家講解下多線程編程的過程,一起來了解下吧。

#!/bin/bash

#———————————————————————————–

# 此例子說明了一種用wait、read命令模擬多線程的一種技巧

# 此技巧往往用於多主機檢查,比如ssh登錄、ping等等這種單進程比較慢而不耗費cpu的情況

# 還說明了多線程的控制

#———————————————————————————–

function a_sub

{

# 此處定義一個函數,作為一個線程(子進程)

sleep 3 # 線程的作用是sleep 3s

}

tmp_fifofile=「/tmp/$.fifo」 mkfifo $tmp_fifofile # 新建一個fifo類型的文件

exec 6《》$tmp_fifofile # 將fd6指向fifo類型

rm $tmp_fifofile thread=15 # 此處定義線程數

for

((i=0;i《$thread;i++));do echo

done 》&6 # 事實上就是在fd6中放置了$thread個回車符

for

((i=0;i《50;i++));do # 50次循環,可以理解為50個主機,或其他

read -u6 # 一個read -u6命令執行一次,就從fd6中減去一個回車符,然後向下執行,

# fd6中沒有回車符的時候,就停在這了,從而實現了線程數量控制

{ # 此處子進程開始執行,被放到後台

a_sub &&

{ # 此處可以用來判斷子進程的邏輯

echo 「a_sub is finished」

}

||

{ echo 「sub error」

}

echo 》&6 # 當進程結束以後,再向fd6中加上一個回車符,即補上了read -u6減去的那個

}

& done wait # 等待所有的後檯子進程結束

exec 6》&- # 關閉df6 exit 0

說明:

此程序中的命令

mkfifo tmpfile

和linux中的命令

mknod tmpfile p

效?果相同。區別是mkfifo為POSIX標准,因此推薦使用它。該命令創建了一個先入先出的管道文件,並為其分配文件標志符6。管道文件是進程之間通信的一種方式,注意這一句很重要

exec 6《》$tmp_fifofile # 將fd6指向fifo類型

如果沒有這句,在向文件$tmp_fifofile或者&6寫入數據時,程序會被阻塞,直到有read讀出了管道文件中的數據為止。而執行了上面這一句後就可以在程序運行期間不斷向fifo類型的文件寫入數據而不會阻塞,並且數據會被保存下來以供read程序讀出。

通過運行命令:

time 。/multithread.sh 》/dev/null

最終運算時間: 50/15 = 3組(每組15)+1組(5個《15 組成一個組)= 4組,每組花費時間:3秒,

則 3 * 4 = 12 秒。

傳統非多線程的代碼 運算時間: 50 * 3 = 150 秒。

上面就是Linux下shell多線程編程的實例介紹了,使用多線程編程還能夠改善程序結構,有興趣的朋友不妨試試看吧。

『拾』 在linux中,如何編寫一個shell腳本來實現如下功能

#!/usr/bin/expect
set timeout 10

spawn ssh [email protected]

expect "*Password*"

send "密碼\r"

expect ">"

send "ls;cd back/rate/;run.sh\r"

expect eof

熱點內容
伺服器快捷方式是什麼意思 發布:2024-05-03 06:28:18 瀏覽:107
我的世界怎麼成為伺服器最靚的仔 發布:2024-05-03 06:26:44 瀏覽:852
安卓手機用博雅mm1用什麼軟體 發布:2024-05-03 06:19:23 瀏覽:692
演算法鍵值 發布:2024-05-03 06:16:52 瀏覽:5
qq密碼哪裡開啟 發布:2024-05-03 06:03:23 瀏覽:579
全排列的遞歸演算法 發布:2024-05-03 05:42:28 瀏覽:901
肥胖的演算法 發布:2024-05-03 05:38:09 瀏覽:783
兩個資料庫事務 發布:2024-05-03 05:33:41 瀏覽:855
phpjson轉 發布:2024-05-03 05:33:40 瀏覽:659
設計一個虛擬存儲區 發布:2024-05-03 05:24:18 瀏覽:927