【发布时间】:2017-08-16 14:51:29
【问题描述】:
我遇到了一个问题,我的 bash 脚本需要很长时间才能启动。起初我认为这是脚本本身的问题,但一个快速的实验证明了这一点。
这是示例脚本
#!/bin/bash
echo 'ping'
当我运行它时
$ time ./script.sh
我明白了
ping
real 0m12.018s
user 0m0.002s
sys 0m0.002s
(我什至看到它长达 17 秒......)令人难以置信的是,当我第二次运行它时,它立即运行。
ping
real 0m0.004s
user 0m0.002s
sys 0m0.002s
但是当我再次编辑文件时,又是漫长的等待。
$ echo 'echo test' >> gbr.sh
$ time ./gbr.sh
ping
test
real 0m13.021s
user 0m0.003s
sys 0m0.003s
这几乎就像 bash 正在编译我的脚本或其他东西。 有什么方法可以调试这个吗?我的.bash_profile 似乎也没有任何问题 - 如果我只是在.bash_profile 的第一行添加一个回显,我仍然只能在之后看到10 多秒。
我已经在 iTerm2 和本地终端中尝试过这个 - 两者都有完全相同的问题。这是在 macOS Sierra 上 - 10.12.3
【问题讨论】:
-
dtrace 是我在这里使用的工具。实际上,dtruss 可能就足够了。
-
(不,没有任何编译过程。是的,可以有脚本即使在非交互式 shell 启动时也可以自行运行,但这是正常/记录的方式是将这样一个脚本的名称放在环境变量
BASH_ENV中,所以如果没有设置,那么你就没有以文档/正确的方式挂钩)。 -
...顺便说一下,这对我来说很像反恶意软件/系统监控产品在做它的事情(即计算脚本的哈希,将哈希发送到远程服务并得到答复)。如果是这样,您应该不仅在 bash 中看到相同的行为,而且在 any 解释的脚本(以
#!/usr/bin/awk -f等开头的脚本等)中看到相同的行为。 -
time bash -c exit需要多长时间? -
也许您的系统在检索
ping二进制路径时由于某种原因出现延迟。我以前在 macOS 中看到过这种行为。尝试使用ping二进制文件的直接路径,并检查它是否有效。ping二进制完整路径是:/sbin/ping