따르다답변:
동시에 여러 bash 인스턴스를 닫을 때 기록이 지워질 수 있는 알려진 경쟁 조건이 있습니다. 이는 bash 기록 파일을 작성할 때 잠금이 사용되지 않기 때문에 발생합니다.
bash 기록 삭제를 방지하는 방법은 무엇입니까?
urxvt
저는 i3wm을 사용하는데 터미널을 수동으로 닫기 전에 컴퓨터를 종료할 때 이런 일이 주로 발생한다고 생각합니다 . (키 바인딩을 통한) 종료 명령은 입니다 systemctl poweroff
.
답변1
경쟁 조건의 원인은 bash가 쉘이 종료될 때만 기록 파일에 기록한다는 것입니다. 또한 여러 셸이 실행 중인 경우 기존 기록 파일을 덮어쓰며 마지막으로 종료된 셸만 기록을 지배하게 됩니다.
따라서 한 가지 해결책은 각 명령 뒤에 기록을 작성하는 것입니다. 이렇게 하면 화살표를 위로 올려 다른 창에서 발생한 기록 이벤트를 볼 수 있으므로 방금 실행한 명령이 열려 있는 모든 셸(있는)에 노출되는 등 부정적인 결과가 발생할 수 있습니다. 이런 일이 발생할 가능성이 가장 높은 곳은 "위로 화살표를 N 번 누른 후 Enter 누르기"와 같은 반복적인 명령 세트를 계속해서 실행하는 경우입니다. 백그라운드 프로세스가 닫힌 창에서 끝나면 갑자기 어떤 명령이 실제로 "N+1번 위쪽 화살표"인지 주의 깊게 살펴보아야 하며, 이는 잘못된 명령을 실행할 위험이 있습니다.
"명령당 기록"을 켜려면 이를 .bashrc에 추가해 보십시오(저장할 기록 행 수는 단지 예일 뿐이며 원하는 경우 변경할 수 있습니다).
HISTFILESIZE=400000000
HISTSIZE=10000
PROMPT_COMMAND="history -a"
export HISTSIZE PROMPT_COMMAND
shopt -s histappend
답변2
Bash를 시작하면 기록이 삭제되었는지 경고합니다(라인 수로 측정). 기록이 삭제되지 않은 경우 백업이 생성됩니다.
~/.bashrc
# backup history/warn about deleted history
if (( $(wc -l < ~/.bash_history) < 1100 ))
then
echo "#########################"
echo ".bash_history was cleared"
echo "#########################"
else
cp ~/.bash_history ~/.bash_history.back
fi
답변3
내 해결책은 로그아웃하기 전에 메모리 내 기록을 디스크 내 기록과 병합하는 것이었습니다...
기록 타임스탬프 순서와 해당 타임스탬프 내의 명령 순서를 유지하면서 이 작업을 수행합니다.
정의된 Perl RE에 따라 고유한 명령(여러 줄 포함)을 제거하거나 단순하고 민감한 명령을 제거(지우기)하는 옵션이 있습니다. 맞게 조정하세요!
이것이 결과입니다 ...https://antofthy.gitlab.io/software/history_merge.bash.txt
쉘 별칭 "hc"(기록 정리용)를 통해 "요청 시" 스크립트를 가져오고 종료하기 전에 ".bash_logout" 구성 파일에서 병합/정리합니다.
즐기다.