如何在Shell脚本中进行异步函数调用

6
我有一组 curl 命令要在 shell 脚本中执行。现在我想让所有这些命令在固定的时间间隔内执行(每个 curl URL 的时间间隔不同),所以我想要做的是对 wait [sec] 命令进行异步调用,并为不同的等待时间执行不同的函数,例如启动 5 个计时器,其中一个为 120 秒,两个为 30 秒,三个为 3000 秒等。然后,一旦它们完成,我想要触发附加到每个超时的处理程序函数的执行。我可以在 JavaScript 和 Node.js 中轻松地实现此操作,因为它们是事件驱动的编程语言。但是我对 shell 脚本了解甚少。那么,我应该如何实现这个功能或者如何在 shell 脚本中进行这样的异步调用呢?如果我没有表达清楚,还需要提供哪些详细信息呢?

60秒的分辨率太粗糙了,这就是为什么你不将它们作为cron作业运行的原因吗? - Deleted User
2个回答

8

有些值得尝试的东西:

delayed_ajax() {
  local url=$1
  local callback=$2
  local seconds=$3

  sleep $seconds
  curl -s "$url" | "$callback"
}

my_handler() {
  # Read from stdin and do something.
  # E.g. just append to a file:
  cat >> /tmp/some_file.txt
}

for delay in 120 30 30 3000 3000; do
  delayed_ajax http://www.example.com/api/something my_handler $delay &
done

啊,是的,如果分钟精度足够的话,cron可能是正确的工具。 - Andreas Kalin
同样地,如果您想在特定时间而不是特定间隔运行命令,则“at”命令也很有用。还可以进行分钟分辨率设置。无论是cron还是at都不需要nohup,但如果您使用我提到的脚本解决方案,则可能需要它。除非使用nohup(或使用disown -h或类似命令取消关联),否则在注销时,脚本解决方案将被HUP信号终止。 - Andreas Kalin
非常感谢,它们确实可以满足我的需求。未来可能会遇到的唯一问题是,由于我将在不久的将来拥有大量进程,因此为每个超时分配太多进程。 - Harshit Laddha
你看到我先漏掉了&符号了吗?没有它就无法异步。 - Andreas Kalin
是的,Bash 倾向于产生大量进程。既然你喜欢 Node 和 JS(也许还有 CoffeeScript),你可以考虑在 Node 中完成它吗? - Andreas Kalin
我知道,我想找一些模块在Node中完成它,但由于它需要紧急处理,我首先考虑用Shell脚本实现,然后再用Node实现。 - Harshit Laddha

0

你也可以使用&符号将此任务放入后台:

sleep 14 && wget http://yoursitehere.com &
sleep 18 && wget http://yoursitehere.com &
sleep 44 && wget http://yoursitehere.com &

这将创建一个后台任务,它会休眠一段固定的时间,然后运行命令。它不会等待每个任务完成。

&& 在这里的意思是,如果前面的事情没有出错,就做下一件事。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接