Bash脚本在OSX上启动非常慢

Jac*_*ius 5 macos bash

我遇到了一个问题,我的bash脚本需要很长时间才能启动。起初我以为这是脚本本身中的某些内容,但是快速实验证明了这一点。

这是示例脚本

#!/bin/bash
echo 'ping'
Run Code Online (Sandbox Code Playgroud)

当我运行它

$ time ./script.sh
Run Code Online (Sandbox Code Playgroud)

我懂了

ping

real    0m12.018s
user    0m0.002s
sys    0m0.002s
Run Code Online (Sandbox Code Playgroud)

(我什至已经看到它会花费 17秒的时间...)令人难以置信的是,当我第二次运行它,它会立即运行。

ping

real    0m0.004s
user    0m0.002s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)

但是,当我再次编辑文件时,又回到了漫长的等待状态。

$ echo 'echo test' >> gbr.sh
$ time ./gbr.sh
ping
test

real    0m13.021s
user    0m0.003s
sys 0m0.003s
Run Code Online (Sandbox Code Playgroud)

几乎就像bash正在编译我的脚本之类的东西。 有什么办法可以调试吗? 对于我来说,这似乎也没有任何意义.bash_profile-如果我只是在第一行上加上回声,.bash_profile我仍然只能在10秒钟后才能看到。

我已经在iTerm2和本机Terminal中尝试过-两者都存在完全相同的问题。这是在macOS Sierra-10.12.3上

Cha*_*ert 4

我在运行 macOS Sierra 10.12.5 和 10.12.6 的工作机器上遇到了同样的问题,我确认 @charles-duffy 是正确的。我公司的反恶意软件是问题所在。他们使用 Carbon Black 名为 Confer 的守护程序来确保端点安全。

运行以下命令查看问题是否停止:

launchctl unload /Library/LaunchDaemons/com.confer.sensor.daemon.plist
Run Code Online (Sandbox Code Playgroud)

我认为 Confer 会对其看到的每个新程序进行指纹识别,并在允许其运行之前尝试将其与黑名单进行比较。看起来一秒钟后就超时了(试图在线注册指纹?),并且某些东西让它一遍又一遍地尝试,产生更长的整数秒延迟。这使得新修改的程序启动缓慢,尽管在采集指纹后速度恢复正常。


运行示例

以下是问题在我的工作笔记本电脑上的表现。随着时间的推移,有时延迟会增加,但每次总是增加整数秒。如果 Confer 记得之前的程序,就不会出现延迟。

bash 脚本

$ bash --norc --noprofile -l  # make sure rc scripts don't interfere

bash-3.2$ echo exit > exit.sh && chmod +x exit.sh

bash-3.2$ time ./exit.sh

real    0m1.004s
user    0m0.001s
sys 0m0.002s

bash-3.2$ time ./exit.sh

real    0m0.002s
user    0m0.001s
sys 0m0.001s
Run Code Online (Sandbox Code Playgroud)

运行提供给以下的命令没有问题bash -c

bash-3.2$ time bash -c exit

real    0m0.008s
user    0m0.002s
sys 0m0.003s
Run Code Online (Sandbox Code Playgroud)

awk 脚本

但问题确实影响了 awk 脚本:

bash-3.2$ printf '%s\n' '#!/usr/bin/env awk -f' 'BEGIN { exit 0; }' > test.awk && chmod +x test.awk

bash-3.2$ time ./test.awk

real    0m4.010s
user    0m0.002s
sys 0m0.001s

bash-3.2$ time ./test.awk

real    0m0.005s
user    0m0.002s
sys 0m0.001s
Run Code Online (Sandbox Code Playgroud)

编译的二进制文件

它甚至影响了已编译的 C 和 Golang 代码:

bash-3.2$ printf '%s\n' '#include "stdio.h"' 'int main() {' 'printf("Hello, world!\n");' 'return 0;' '}' > hello.c && gcc -o hello hello.c

bash-3.2$ time ./hello
Hello, world!

real    0m4.006s
user    0m0.001s
sys 0m0.001s

bash-3.2$ time ./hello
Hello, world!

real    0m0.004s
user    0m0.001s
sys 0m0.001s

bash-3.2$ printf '%s\n' 'package main' 'import "fmt"' 'func main() {' 'fmt.Println("test")' '}' > test.go && go build -o test ./test.go

bash-3.2$ time ./test
test

real    0m4.018s
user    0m0.001s
sys 0m0.003s

bash-3.2$ time ./test
test

real    0m0.005s
user    0m0.001s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)