【问题标题】:How to set timeout on exec command? [duplicate]如何在 exec 命令上设置超时? [复制]
【发布时间】:2019-09-18 08:38:13
【问题描述】:

我有一个 sample.sh 脚本:

#!/bin/sh

echo "start";
exec java -jar myjar.jar
echo "finished successfully";

如何添加超时 exec java -jar myjar.jar 命令? 10 秒后,java 程序应该被终止并且应该打印: 标准输出上的“FAIL: Timed out after java -jar myjar.jar”。

【问题讨论】:

  • 不要使用exec;用 Java 程序替换当前进程,而不是在 Java 程序完成之前暂停它。 exec 成功,echo "finished..." 从不 执行,或者exec 失败,java 从不运行,echo "finished..."立即执行。跨度>
  • 使用timeout。像if timeout 10 sleep 5 ; then ; echo "success" ; else ; echo "fail" ; fi 这样的东西。使用您的 java ... 而不是 sleep 5

标签: linux shell sh exec


【解决方案1】:

您可以在后台启动一个进程,等待一定时间然后杀死父进程。父进程只需要在完成实际工作后立即终止进程。

例如:

#!/bin/sh

# remember PID of main process
main_pid=$$

kill_after() {
    sleep 3
    echo "Killing after 3 seconds of idle."
    kill ${main_pid}
}

# start kill process and remember killer PID
kill_after &
killer=$!

# your main process (for testing, `sleep 5`)
#java -jar myjar.jar
sleep 5

# kill killer so it doesn't attempt to kill the main
# process anymore
kill $killer

注意$$返回当前进程的PID,$!返回刚刚启动过程的PID(本例中为kill_after)。

【讨论】:

    【解决方案2】:

    您可以在后台启动 java,并在 10 秒后使用 kill 终止它:

    echo "start";
    exec bash -c 'java -jar myjar.jar && echo "finished successfully"' &
    sleep 10 && (kill %1 && echo "Terminated" || echo "Nothing killed")
    

    但在这种情况下,您的脚本将始终运行 10 秒。

    【讨论】:

    • exec ... && echo ... 永远不会执行结尾的echo
    • @chepner 你是对的。刚刚更新了我对 exec bash 的回答。
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 2014-08-13
    • 1970-01-01
    • 2016-12-27
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多