轮询= 0的超时生存期超过超时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了轮询= 0的超时生存期超过超时相关的知识,希望对你有一定的参考价值。

对于上下文:ansible 2.7.9

我正在尝试Ansible异步操作,并正在使用此剧本:

---
- hosts: 127.0.0.1
  connection: local
  gather_facts: no
  tasks:

  - name: This is "long task", sleeping for {{ secondsTaskLong }} seconds
    shell: "[ -f testFile ] && rm testFile; sleep {{ secondsTaskLong }}; touch testFile"
    async: "{{ timeoutSeconds }} "
    poll: 0

  - stat:
      path: testFile
    register: checkTestFile

  - name: Check the test file exists
    assert:
      that: checkTestFile.stat.exists
...

测试1:

ansible-playbook async.yml --extra-var "secondsTaskLong=2 timeoutSeconds=3"

断言失败,但是如果我检查目录内容,ls将显示测试文件./testFile在这里。

测试2:

持续时间为5s的测试:

ansible-playbook async.yml --extra-var "secondsTaskLong=5 timeoutSeconds=3"; watch -n 1 -d "ls -l testFile"

[最后的watch部分显示了在执行剧本后几秒钟就创建了测试文件。

测试3:

现在持续时间为9秒(即,超出超时时间):

ansible-playbook async.yml --extra-var "secondsTaskLong=9 timeoutSeconds=3"; watch -n 1 -d "ls -l testFile"

仍然创建测试文件。

测试4:

现在尝试10秒:

ansible-playbook async.yml --extra-var "secondsTaskLong=10 timeoutSeconds=3"; watch -n 1 -d "ls -l testFile"

未创建测试文件。

到底发生了什么?是什么让这个“长期任务”在超时后还能生存9秒?是什么在10秒内杀死它?

编辑:

我可以添加一个显式的连接超时> 10s,但仍然观察到相同的行为:

ansible-playbook async.yml -T 20 --extra-var "secondsTaskLong=9 timeoutSeconds=3"; watch -n 1 -d "ls -l testFile"

ansible-playbook async.yml -T 20 --extra-var "secondsTaskLong=10 timeoutSeconds=3"; watch -n 1 -d "ls -l testFile"
答案

到底发生了什么?是什么让这个“漫长的任务”活了9年秒,超出超时时间?是什么在10秒内杀死它?

poll > 0时,ansible使用async值作为超时,否则,使用连接超时(默认为10秒)。请参阅有关连接超时herepollhere的详细信息。

例如,如果您像下面那样更改任务并使用timeoutSeconds=3 and secondsTaskLong=4,则您将在3秒后收到超时错误,并且断言将失败。但是,对于timeoutSeconds=3 and secondsTaskLong=2,assert将成功。

  - name: This is "long task", sleeping for {{ secondsTaskLong }} seconds
    shell: "[ -f testFile ] && rm testFile; sleep {{ secondsTaskLong }}; touch testFile"
    async: "{{ timeoutSeconds }} "
    poll: 1

以上是关于轮询= 0的超时生存期超过超时的主要内容,如果未能解决你的问题,请参考以下文章

Spring Web 应用程序中带有 Ajax 轮询的会话超时

Ansible 的委托 并发和任务超时

如何判断一个程序是不是超时??

API 轮询和超时

STM32HAL轮询模式串口接收函数超时等待问题?

Mio 在零持续时间超时的轮询中的行为是啥?