我对Linux Shell Scripting非常陌生,并且想知道是否有人可以帮助我完成以下操作。
我创建了一个脚本来与我的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 root@128.221.252.35 "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 root@128.221.252.36 "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 root@128.221.252.67 "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 root@128.221.252.68 "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 root@128.221.252.69 "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 root@128.221.252.70 "ntpd -q -g"
echo Finished synching director-2-2-B
sleep 2
echo
echo
echo Finished Synching SVT Cluster 2 directors with SMS.
脚本似乎只在第一个exec命令后完成。
2011年8月25日星期四12:40:44
将GTS Cluster 1导演与SMS同步。
更改导演-1-1-A的日期和时间
非常感谢任何帮助=)
答案 0 :(得分:8)
exec
的重点是替换当前进程。在shell脚本中,这意味着shell被替换,exec
之后不再执行任何操作。我疯狂的猜测是:您可能希望使用&
来代替命令(ssh ... &
)吗?
但是,如果您只想按顺序运行ssh,每次等到它完成后,只需删除'exec'字样即可。没有必要用exec
表达“我想运行this_command”。只需this_command
即可。
哦,把它变成#!/bin/sh
脚本;你的脚本中没有bashism或linuxism。如果可以的话,最好避免使用bashisms。这样,如果你的老板决定切换到FreeBSD,你的脚本可以不加修改地运行。
答案 1 :(得分: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之谜......