shell 如何创建一个脚本来顺序执行多个“exec”命令?

628mspwn  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(201)

我对Linux Shell脚本编写非常陌生,想知道是否有人可以帮助我完成以下内容。
我创建了一个脚本来与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群集1控制器与SMS同步。
更改Director-1-1-A的日期和时间
任何帮助将不胜感激=)

nuypyhwy

nuypyhwy1#

exec的全部意义是替换当前进程。在shell脚本中,这意味着shell被替换,并且exec之后的任何内容都不会再执行。我的猜测是:也许你想用&代替(ssh ... &)作为命令的后台?
但是如果你只想按顺序运行sshs,每次都要等到它完成,只要去掉“exec”这个词就行了。没有必要用exec来表达“我想运行这个命令”。只需要this_command就可以了。
哦,把它做成一个#!/bin/sh脚本;在你的脚本中没有bashism或者linux。2如果可以的话,避免bashism是一个很好的练习。3这样的话,如果你的老板决定转换到FreeBSD,你的脚本可以不被修改地运行。

9w11ddsr

9w11ddsr2#

您可以运行所有命令,但最后一个命令在后台运行,最后一个命令使用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奥秘。

相关问题