プロローグ
2022年末、人類はWSLのファイルシステムを消し飛ばした*1のであった。かけがえのないシェルの履歴*2の思い出と共に。
シェルの履歴が全部消えると、補完に頼って入力しているコマンドが急に打てなくなって、不便になる。2023年はこういった悲しみを減らしていきたい。
ということで、表題の取り組みをやっていくことにした。
バックアップするスクリプトを書く
以下のようなスクリプトを ~/local/bin/backup-zsh-history
など適当なパスに置いた。5秒おきに ~/.zsh_history
ファイルをDropboxにコピーするスクリプトになっている。-u
オプションを付けることで、~/.zsh_history
が更新されていなかったらコピーしないようにしている。
set -eu
if [ "$BACKUP_DEST_PATH" = "" ]; then
echo 'BACKUP_DEST_PATH not set' > /dev/stderr
exit 1
fi
while sleep 5; do
cp -u /home/utgwkk/.zsh_history $BACKUP_DEST_PATH
done
systemd unit fileを書く
スクリプトを手軽にdaemonizeできたらなんでもいい。最近のWSLではsystemdが使えるので、unit fileを書いて適当なところに設置したらよい。user unitは使えない*3ようなので、最速で動くことを重視して /etc/systemd/system
ディレクトリ以下に置いた。
[Unit]
Description=Backup zsh_history
[Service]
Environment=BACKUP_DEST_PATH=/mnt/c/Users/utgwkk/Dropbox/zsh_history/kaede
ExecStart=/home/utgwkk/local/bin/backup-zsh-history
[Install]
WantedBy=default.target
あとはこのunitを動かせば完成する。
エピローグ
2023年はこのようにしてシェルの履歴をDropboxにバックアップすることにした。これでまたWSLのファイルシステムを吹き飛ばしてもDropboxから復元できるはず。WSLでsystemdが (おおむね) 動くようになったのを知れたのもよかったと思う。systemd user unitが動くようになったらまた教えてください。
(2023/1/4 17:23 追記)
b.hatena.ne.jp
だいたいそういう理論です。コピー元のファイルサイズが明らかに小さかったらcpしない、みたいなことができるとより安全になりそうだけど、うまくできるかどうか。
(2023/1/4 17:25 追記)
ある程度の期間ごとにコピー先のファイルを分けることもできそう、しかしDropbox上のファイルが増殖しまくるのでは?
WSLでsystemdを有効にしたら、見出しのような現象が発生した。WSL上ではWindowsの実行ファイルも実行できるはずだが、以下のようにexec format errorが出て実行できなくなる。
% /mnt/c/win32yank/win32yank.exe -o
zsh: exec format error: /mnt/c/win32yank/win32yank.exe
WSLのリポジトリのissueでworkaroundが紹介されているので、これに倣えばよい。
github.com
つまり、以下のような内容のファイルを /usr/lib/binfmt.d/WSLInterop.conf
というパスに保存して sudo systemctl restart systemd-binfmt
コマンドを実行したら直る。
:WSLInterop:M::MZ::/init:PF