这是一个经常被问到的问题:
这次,我添加了一个转折点。我需要在 中执行此操作zsh
。另外,解决方案:
- 必须保持沉默(即没有作业控制消息)
zsh
必须是可移植的(即尽可能接近纯粹。假设不是coreutils
)- 应该是正确的(见注释)
- 应该表现得像 GNU
timeout
关于正确性:
启动一个进程,等待一段时间,然后杀死它的PID是错误的。这是错误的,因为如果超时为日志,或者系统 PID 不足,我们计时的进程可能会终止,并且稍后会使用相同的 PID 启动新进程。在实践中,这种情况很少发生,但如果有一种更清晰的方法来跟踪进程何时终止并仅在进程尚未终止时将其杀死,那就太好了。
答案1
首先我想到的是在进程创建后获取 PID,使用zstat
工具(请参阅man zshmodules
)来获取进程时间戳,例如zstat '+mtime' /proc/PID
,并在所需的时间后检查给定的时间戳是否/proc/PID
没有更改 - 如果是,则终止作业。