exec命令詳解

  

基礎命令學習目錄首頁html

 

原文連接:shell

exec: 數組

在bash下輸入man exec,找到exec命令解釋處,能夠看到有」No new process is created.」這樣的解釋,這就是說exec命令不產生新的子進程。那麼exec與source的區別是什麼呢?安全

exec命令在執行時會把當前的shell process關閉,而後換到後面的命令繼續執行。bash

 

1. 系統調用exec是以新的進程去代替原來的進程,但進程的PID保持不變。所以,能夠這樣認爲,exec系統調用並無建立新的進程,只是替換了原來進程上下文的內容。原進程的代碼段,數據段,堆棧段被新的進程所代替。dom

一個進程主要包括如下幾個方面的內容:函數

(1)一個能夠執行的程序post

(2) 與進程相關聯的所有數據(包括變量,內存,緩衝區)性能

(3)程序上下文(程序計數器PC,保存程序執行的位置)學習

2. exec是一個函數簇,由6個函數組成,分別是以excl和execv打頭的。

執行exec系統調用,通常都是這樣,用fork()函數新創建一個進程,而後讓進程去執行exec調用。咱們知道,在fork()創建新進程以後,父進各與子進程共享代碼段,但數據空間是分開的,但父進程會把本身數據空間的內容copy到子進程中去,還有上下文也會copy到子進程中去。而爲了提升效率,採用一種寫時copy的策略,即建立子進程的時候,並不copy父進程的地址空間,父子進程擁有共同的地址空間,只有當子進程須要寫入數據時(如向緩衝區寫入數據),這時候會複製地址空間,複製緩衝區到子進程中去。從而父子進程擁有獨立的地址空間。而對於fork()以後執行exec後,這種策略可以很好的提升效率,若是一開始就copy,那麼exec以後,子進程的數據會被放棄,被新的進程所代替。

 3. exec與system的區別

(1) exec是直接用新的進程去代替原來的程序運行,運行完畢以後不回到原先的程序中去。

(2) system是調用shell執行你的命令,system=fork+exec+waitpid,執行完畢以後,回到原先的程序中去。繼續執行下面的部分。

總之,若是你用exec調用,首先應該fork一個新的進程,而後exec. 而system不須要你fork新進程,已經封裝好了。

 
 
bubuko.com,布布扣
 

 舉例:使用exec或ok來執行shell命令

使用find時,只要把想要的操做寫在一個文件裏,就能夠用exec來配合find查找,很方便的

在有些操做系統中只容許-exec選項執行諸如l s或ls -l這樣的命令。大多數用戶使用這一選項是爲了查找舊文件並刪除它們。建議在真正執行rm命令刪除文件以前,最好先用ls命令看一下,確認它們是所要刪除的文件。

exec選項後面跟隨着所要執行的命令或腳本,而後是一對兒{ },一個空格和一個\,最後是一個分號。爲了使用exec選項,必需要同時使用print選項。若是驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。

例如:爲了用ls -l命令列出所匹配到的文件,能夠把ls -l命令放在find命令的-exec選項中

 

# find . -type f -exec ls -l {  } \;
-rw-r--r--    1 root     root        34928 2003-02-25  ./conf/httpd.conf
-rw-r--r--    1 root     root        12959 2003-02-25  ./conf/magic
-rw-r--r--    1 root     root          180 2003-02-25  ./conf.d/README  

 

上面的例子中,find命令匹配到了當前目錄下的全部普通文件,並在-exec選項中使用ls -l命令將它們列出。
在/logs目錄中查找更改時間在5日之前的文件並刪除它們:

 

$ find logs -type f -mtime +5 -exec rm {  } \;  

 

記住:在shell中用任何方式刪除文件以前,應當先查看相應的文件,必定要當心!當使用諸如mv或rm命令時,可使用-exec選項的安全模式。它將在對每一個匹配到的文件進行操做以前提示你。

在下面的例子中, find命令在當前目錄中查找全部文件名以.LOG結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除以前先給出提示。

 

$ find . -name "*.conf"  -mtime +5 -ok rm {  } \;
< rm ... ./conf/httpd.conf > ? n  

 

按y鍵刪除文件,按n鍵不刪除。

任何形式的命令均可以在-exec選項中使用。

在下面的例子中咱們使用grep命令。find命令首先匹配全部文件名爲「 passwd*」的文件,例如passwd、passwd.old、passwd.bak,而後執行grep命令看看在這些文件中是否存在一個sam用戶。

 

# find /etc -name "passwd*" -exec grep "sam" {  } \;
sam:x:501:501::/usr/sam:/bin/bash  

 


2、find命令的例子;


一、查找當前用戶主目錄下的全部文件:

下面兩種方法均可以使用

 

$ find $HOME -print
$ find ~ -print

二、讓當前目錄中文件屬主具備讀、寫權限,而且文件所屬組的用戶和其餘用戶具備讀權限的文件;
$ find . -type f -perm 644 -exec ls -l {  } \;  

三、爲了查找系統中全部文件長度爲0的普通文件,並列出它們的完整路徑;

 $ find / -type f -size 0 -exec ls -l {  } \;  

四、查找/var/logs目錄中更改時間在7日之前的普通文件,並在刪除以前詢問它們;

 $ find /var/logs -type f -mtime +7 -ok rm {  } \;  

 

五、爲了查找系統中全部屬於root組的文件;

$find . -group root -exec ls -l {  } \;
-rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1  

 

六、find命令將刪除當目錄中訪問時間在7日以來、含有數字後綴的admin.log文件。

該命令只檢查三位數字,因此相應文件的後綴不要超過999。先建幾個admin.log*的文件 ,才能使用下面這個命令

 $ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
rm {  } \;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n  

七、爲了查找當前文件系統中的全部目錄並排序;

 $ find . -type d | sort  

八、爲了查找系統中全部的rmt磁帶設備;

 $ find /dev/rmt -print  

3、xargs

xargs - build and execute command lines from standard input

在使用find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec執行。但有些系統對可以傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘以後,就會出現溢出錯誤。錯誤信息一般是「參數列太長」或「參數列溢出」。這就是xargs命令的用處所在,特別是與find命令一塊兒使用。

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是所有,不像-exec選項那樣。這樣它能夠先處理最早獲取的一部分文件,而後是下一批,並如此繼續下去。

在有些系統中,使用-exec選項會爲處理每個匹配到的文件而發起一個相應的進程,並不是將匹配到的文件所有做爲參數一次執行;這樣在有些狀況下就會出現進程過多,系統性能降低的問題,於是效率不高;

而使用xargs命令則只有一個進程。另外,在使用xargs命令時,到底是一次獲取全部的參數,仍是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來肯定。

來看看xargs命令是如何同find命令一塊兒使用的,並給出一些例子。

下面的例子查找系統中的每個普通文件,而後使用xargs命令來測試它們分別屬於哪類文件

 

#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
......  

 

在整個系統中查找內存信息轉儲文件(core dump) ,而後把結果保存到/tmp/core.log 文件中:

 

$ find / -name "core" -print | xargs echo "" >/tmp/core.log  

 

上面這個執行太慢,我改爲在當前目錄下查找

 

#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6  

 

在當前目錄下查找全部用戶具備讀、寫和執行權限的文件,並收回相應的寫權限:

 

# ls -l
drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf  

 

用grep命令在全部的普通文件中搜索hostname這個詞:

 

# find . -type f -print | xargs grep "hostname"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your  

 

用grep命令在當前目錄下的全部普通文件中搜索hostnames這個詞:

 

# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your  

 

注意,在上面的例子中, \用來取消find命令中的*在shell中的特殊含義。

find命令配合使用exec和xargs可使用戶對所匹配到的文件執行幾乎全部的命令。

 

exec命令詳解,布布扣,bubuko.com

exec命令詳解

標籤:上下文   created   

原文地址:http://zlong32.blog.51cto.com/1073540/1409796

相關文章
相關標籤/搜索