%20-%20Texlive%202022.png)
Die „normale“ Kompilierung einer ziemlich komplexen (Thesis-Vorlage) Latex-Datei in macOS Monterey Version 12.6 funktioniert in TeX Live 2021 und TeX Live 2022 einwandfrei mit dem Befehl latexmk -time -shell-escape -synctex=0 -emulate-aux-dir -pdf -silent template
.
Um das Testen verschiedener Varianten dieser Vorlage zu beschleunigen, …
- Erstellen Sie mehrere Kopien der Quelle (jede Kopie in einem eigenen Ordner).
- Passen Sie jede Kopie nach Bedarf an.
latexmk
Führen Sie mit dem obigen Befehl mehrere Instanzen von aus , eine über jeder Kopie.
Mit TeX Live 2021 läuft das Skript reibungslos.
Mit TeX Live 2022 erhalte ich diesen Fehler:
/var/folders/f1/4fh25zqx0_bd81r_n925d_4r0000gp/T/par-6a6d6c/cache-ff0e0f52fce2a47a2eaf3d127e3cbc846f2f7d08/thin/biber: cannot execute thin binary /var/folders/f1/4fh25zqx0_bd81r_n925d_4r0000gp/T/par-6a6d6c/cache-ff0e0f52fce2a47a2eaf3d127e3cbc846f2f7d08/thin/biber (errno=8)
Ich habe versucht, zwei Biber-Instanzen (mehr oder weniger) gleichzeitig auszuführen, und es gab kein Problem. Ich vermute, das Problem hängt mit der Kombination von zusammen latexmk + biber
.
Kann jemand etwas Einblick in die Fehlermeldung dieses Bibers geben?
Antwort1
Sie können dies erreichen, indem Sie für verschiedene Instanzen von unterschiedliche Caches erzwingen biber
. Legen Sie die Umgebungsvariable PAR_TMPDIR
für die Instanzen einfach unterschiedlich fest, da diese den Cachespeicherort bestimmt, wenn sie festgelegt ist:
mkdir /tmp/bibercache{1,2}
PAR_TEMPDIR=/tmp/bibercache1 biber ...
PAR_TEMPDIR=/tmp/bibercache2 biber ...
Antwort2
Dies ist keine wirkliche Lösung, sondern eher mein Workaround für das Problem!
Kontext: Unter macOS werden zwei Instanzen latxmk
gleichzeitig ausgeführt, jedoch in unterschiedlichen Ordnern.
Symptom: latexmk
schlägt mit der Meldung „Thin-Binärdatei kann nicht ausgeführt werden”
Ursache: Es werden zwei Instanzen von gleichzeitig latexmk
ausgeführt .biber
Diagnose: biber
verwendet sein Cahce-Verzeichnis zum Lesen und Speichern von Daten, und diese Aktionen sind bei gleichzeitigen Ausführungen nicht ausreichend geschützt biber
.
Lösung: Stellen Sie sicher, dass nur eine einzige Instanz von biber
ausgeführt wird, indem Sie latexmk
unser eigenes Frontend für aufrufen biber
, das vor der tatsächlichen Ausführung eine Dateisystemsperre erwirbt biber
und diese Sperre anschließend freigibt.
Implementierung:
- Kopieren Sie das folgende Bash-Skript in ein Verzeichnis Ihrer Wahl und geben Sie ihm einen Namen
biber
(z. B. ). Denken Sie daran, die Variable im Skript$HOME/bin/biber
anzupassen .BIBER
#!/bin/bash
# Please set BIBER to the real biber command.
# Check its location with the command "type biber".
BIBER=/Library/TeX/texbin/biber
LOCKFILE=/tmp/biber.lock
_lock() {
# Wait until the Lock File does not exists, then create it
while ! { set -C; 2>/dev/null >$LOCKFILE; }; do :; done
}
_unlock() {
rm -f $LOCKFILE
}
_lock
$BIBER $@
_unlock
- Führen Sie mit dem folgenden Befehl so viele Instanzen aus,
latexmk
wie Sie möchten. Bitte beachten Sie, dass$HOME/bin
durch den Namen des Verzeichnisses ersetzt werden muss, in dem Sie das Bash-Skript gespeichert haben.
PATH=$HOME/bin:$PATH latexmk <your_flags> <your_latrex_file>