我遇到了一个问题,我的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上
我在运行 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 --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 脚本:
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)
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |