gpt4 book ai didi

bash - 在 bash 中执行一个定时函数

转载 作者:行者123 更新时间:2023-12-04 16:11:08 26 4
gpt4 key购买 nike

我正在尝试实现一个定时功能。如果计时器超时,则应终止函数/命令。如果函数/命令完成,定时器不应该让 bash 等待定时器超时。

(cmdpid=$BASHPID; \
( sleep 60; kill $cmdpid 2>/dev/null) & \
child_pid=$!; \
ssh remote_host /users/jj/test.sh; \
kill -9 $child_pid)

test.sh 可能会或可能不会在 60 秒内完成。这很好用。

但是当我想得到 test.sh 的结果时,它回显“SUCESS”或“FAILURE”,我尝试了

result=$(cmdpid=$BASHPID; \
( sleep 60; kill $cmdpid 2>/dev/null) & \
child_pid=$!; \
ssh remote_host /users/jj/test.sh; \
kill -9 $child_pid)

它在这里等待定时器退出。我可以看到使用 set -x 命令执行了“kill -9 $child_pid”,但 kill 并没有真正杀死子 shell。

最佳答案

解决这个问题的一种方法是在单独的脚本上运行计时器,比如 MyTimerTest,它从(比如)MainScriptTest 调用但单独运行,然后先完成的脚本“杀死”另一个。例如:

MainScriptTest 上,您可以将其放在开头:

nohup /folder/MyTimerTest > /dev/null 2>&1 &

MainScriptTest 上,您可以将其放在最后:

killall MyTimerTest > /dev/null 2>&1

MyTimerTest 可能是这样的:

#!/bin/bash
sleep 60
killall MainScriptTest > /dev/null 2>&1
exit 0

注意:混合大小写字母的脚本的长名称(例如:MainScriptTest)是故意的,killall 区分大小写,这有助于排除它杀死了它不应该杀死的东西。为了非常安全,除了较长的名称之外,您甚至可能还想添加一个标记,例如:MainScriptTest88888 或类似的名称。

编辑:感谢gilez,他建议使用timeout 命令。如果您的系统可以使用它,那么可以像这样快速地做一行:

timeout 60 bash -c "/folder/MainScriptTest"

使用timeout 很方便。但是,如果 MainScriptTest 创建了独立的子进程(例如通过调用:nohup/folder/OtherScript &),则 timeout 不会终止这些子进程, 导出不会干净。

我给出的第一个解决方案更长,但可以通过将它们添加到 MainScriptTest 来自定义杀死那些子进程(或您想要的任何其他进程),例如:

killall OtherScript > /dev/null 2>&1

关于bash - 在 bash 中执行一个定时函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com