【问题标题】:Skip the line of execution in shell script if the line take more time to execute如果该行需要更多时间执行,则跳过 shell 脚本中的执行行
【发布时间】:2021-04-24 10:35:39
【问题描述】:

我有一个 shell 脚本,它将停止 IBM WebSphere 中的 JVM

如下所示

//Some code 
sh /application/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/stopServer.sh JMS-Server -username admin -password ...... 
echo "Stop xyzServer JVM" 
//Some code

我的问题是,有时停止服务器需要很长时间,因此脚本会继续运行并且永远不会结束

我需要一个解决方案来跳过这行执行,如果这段代码等待JVM停止完成,如果JVM在一定时间后没有停止,执行应该转到下一行

你能帮忙吗?

【问题讨论】:

    标签: shell scripting logic sh websphere-8


    【解决方案1】:

    我会尝试在您的命令末尾附加 &,这将在后台 shell 中运行它。然后,在您回显后添加一个sleep 命令,无论您希望等待停止命令多长时间,然后再继续。总体而言,类似于:

    //Some code 
    sh /application/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/stopServer.sh JMS-Server -username admin -password ...... &
    echo "Stop xyzServer JVM" 
    sleep 10m
    //Some code```
    

    【讨论】:

    • 如果线程在后台运行,并且如果 stopserver 执行挂起很长时间,执行是否仍会继续执行下一行?不影响脚本的整个执行?如果是这样的话,睡眠不是必需的吗?
    • 不管它是否挂起,它都会立即继续到下一行,而问题是“如果JVM在一定时间后没有停止”,因此睡眠以满足该要求。话虽如此,timeout 命令可能会更好,如果您想在一段时间后停止停止,然后再继续脚本中的下一行(而 &wait 不会,除非您添加一个kill 命令,但此时你应该只使用超时......所以这取决于你想要什么行为)。
    【解决方案2】:

    使用超时命令:

    //Some code 
    timeout 180 sh /application/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/stopServer.sh JMS-Server -username admin -password ...... && echo "Stopped xyzServer JVM" || echo "xyzServer JVM stop, timeout" 
    //Some code
    

    运行 stopServer.sh 脚本,如果在 180 秒内没有返回退出码或退出码不为 0,则打印“xyzServer JVM stop, timeout”,否则打印“Stopped xyzServer JVM”

    【讨论】:

    • 不用担心。如果这符合您的目标,请花时间接受解决方案。
    • 我已经保持超时 20 sh /application/...... 我可以看到它正确路由到 else 条件以防重启出现问题,但我看不到它等待 20 秒,而是立即路由,是不是因为是后台进程?
    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2014-05-15
    相关资源
    最近更新 更多