sleep
실행 속도를 저하시키는 명령이나 무언가가 있는 경우 .bashrc
이를 프로파일링하여 다음과 같이 느린 부분을 확인할 수 있습니다.
$ printf "set -x\nPS4='+\\\\t '\nexport HISTFILE=empty\nsleep 4\ntrue\n" > mybashrc
$ > empty
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:13:47 export HISTFILE=empty
+19:13:47 HISTFILE=empty
+19:13:47 sleep 4
+19:13:51 true
$ exit
+19:13:51 exit
exit
real 0m4.022s
user 0m0.010s
sys 0m0.010s
그리고
다른
옵션
정확성을 높이려면 GNU를 사용하십시오 date
.
하지만 다음과 같은 대규모 bash 기록 파일이 있다고 가정해 보겠습니다.
$ yes ls | head -n 9999999 > big-hist
$ du -sh big-hist
29M big-hist
이제 셸도 매우 느리게 시작되지만(내 컴퓨터에서는 약 4초) 시간이 어디에 소요되는지 알 수 없습니다 .bashrc
.
$ printf "set -x\nPS4='+\\\\t '\nexport HISTSIZE=-1\nexport HISTFILESIZE=-1\nexport HISTFILE=big-hist\ntrue\n" > mybashrc
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:12:23 export HISTSIZE=-1
+19:12:23 HISTSIZE=-1
+19:12:23 export HISTFILESIZE=-1
+19:12:23 HISTFILESIZE=-1
+19:12:23 export HISTFILE=big-hist
+19:12:23 HISTFILE=big-hist
+19:12:23 true
$ exit
+19:12:27 exit
exit
real 0m4.184s
user 0m3.641s
sys 0m0.536s
내가 생각해 낼 수 있는 가장 좋은 추측은 다음과 같이 실행하는 것입니다.
$ time bash -i <<< exit
$ SHLVL=2 $ exit
exit
real 0m0.400s
user 0m0.326s
sys 0m0.075s
그런 다음 마지막 줄을 추가하십시오 .bashrc
.
HISTFILE=/dev/null
그리고 다시 실행하세요:
$ time bash -i <<< exit
$ exit
exit
real 0m0.081s
user 0m0.059s
sys 0m0.023s
이것이 기록 파일을 처리하는 데 소요된 시간만을 측정하는지 완전히 확신할 수는 없습니다.
(참고: 직접 해보면 .bashrc
타이밍이 완료된 후 마지막 줄을 삭제하는 것을 잊지 마세요!)
내가 몇 년 동안 갖고 있었기 때문에 이것은 나에게 특히 흥미로웠다.
활성화됨
무한한 역사
내 경우에는 .bashrc
새로운 대화형 셸의 시작 시간이 영향을 받은 것으로 나타났습니다. 위의 타이밍이 정확하면 지연 시간이 300밀리초를 넘었습니다.
답변1
나는 당신의 측정을 신뢰하지 않을 이유가 없습니다.
하지만 bash
이를 실행해 strace
보면 파일이 열리는 순서를 볼 수 있습니다.
$ strace -t -f -e trace=file bash -i <<<exit 2>&1 | grep -E 'open(at)?\(' ; fg
[...]
03:10:39 openat(AT_FDCWD, "/home/hl/.bashrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.DISPLAY", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 4
fg
이것이 왜 필요한지 모르겠습니다 . 어쩌면 셸을 배경으로 보내는 것이 내 셸 구성에 있는 것일 수도 있습니다.