2011-08-25 99 views
2

我對Linux Shell腳本非常新穎,並想知道是否有人可以幫我解決以下問題。如何創建一個腳本來順序執行多個「exec」命令?

我創建了一個腳本我的Linux機器,以同步的時間,但只有一個exec命令似乎完成

#!/bin/bash 
#Director SMS Synch Time Script 

echo The current date and time is: 
date 
echo 

echo Synching GTS Cluster 1 directors with SMS. 
echo 
echo Changing date and time for director-1-1-A 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-1-1-A 
echo 

sleep 2 

echo Changing date and time for director-1-1-B 
exec ssh [email protected] "ntp -q -g" 
echo Finished synching director-1-1-B 
echo 

sleep 2 

echo Finished Synching GTS Cluster 1 directors with SMS. 
sleep 2 
echo 
echo Synching SVT Cluster 2 directors with SMS. 
echo 
echo Changing date and time for director-2-1-A 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-1-A 
echo 

sleep 2 

echo Changing date and time for director-2-1-B 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-1-B 
echo 

sleep 2 

echo Changing date and time for director-2-2-A 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-2-A 
echo 

sleep 2 

echo Changing date and time for director-2-2-B 
exec ssh [email protected] "ntpd -q -g" 
echo Finished synching director-2-2-B 

sleep 2 

echo 

echo 
echo Finished Synching SVT Cluster 2 directors with SMS. 

腳本似乎只有第一exec命令後完成。

週四8月25日12時40分44秒EDT 2011

Synching GTS集羣1名董事短信。

改變的日期和時間爲導演-1-1-A

任何幫助,將不勝感激=)

+0

man exec將解釋爲什麼發生這種情況。擺脫高管,你應該是金。 OTOH這看起來像是一些嚴重的ntpd濫用! – fvu

+0

你必須告訴我們爲什麼你需要執行每個ssh。 ':g/exec/s/exec //'(刪除所有可執行文件,它應該可以工作)。祝你好運。 – shellter

+0

@fvu:'man sh'可能是一個更好的方法來找出'exec'內置的功能。 – Jens

回答

7

exec整點是到取代當前進程。在shell腳本中,這意味着shell被替換,在exec之後沒有任何更新。我瘋狂的猜測是:也許你想用&而不是(ssh ... &)背景命令?

如果你只是想按順序運行sshs,每次等待它完成,只要刪除'exec'字。沒有必要用exec表示「我想運行this_command」。只需this_command就可以做到。

哦,並且使這個#!/bin/sh腳本;腳本中沒有bashism或linuxism。如果可以的話,避免背痛是很好的做法。這樣,如果你的老闆決定改用FreeBSD,你的腳本可以不加修改地運行。

5

你可以運行所有命令,但最後在後臺,最後以exec:

例如,如果你有4個命令:

#!/bin/bash 

command1 & 
command2 & 
command3 & 

exec command4 

流程執行Exec之前樹:

bash       < your terminal 
    | 
    +----bash     < the script 
     | 
     +------command1 
     | 
     +------command2 
     | 
     +------command3 

進程執行EXEC後樹:

bash       < your terminal 
    | 
    +------command4 
      | 
      +------command1 
      | 
      +------command2 
      | 
      +------command3 

正如你看到的,前三個命令的所有權時,該腳本的bash進程被command4取代被轉移到command4

注:

如果command4退出其他命令前,處理樹木變成:

init       < unix init process (PID 1) 
    | 
    +------command1 
    | 
    +------command2 
    | 
    +------command3 

雖然所有權應邏輯上已轉移到的bash終端處理? Unix的奧祕......

相關問題