Fehler in Biber (über Latexmk) - Texlive 2022

Fehler in Biber (über Latexmk) - Texlive 2022

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.
  • latexmkFü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_TMPDIRfü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 latxmkgleichzeitig ausgeführt, jedoch in unterschiedlichen Ordnern.

Symptom: latexmkschlägt mit der Meldung „Thin-Binärdatei kann nicht ausgeführt werden

Ursache: Es werden zwei Instanzen von gleichzeitig latexmkausgeführt .biber

Diagnose: biberverwendet 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 biberausgeführt wird, indem Sie latexmkunser eigenes Frontend für aufrufen biber, das vor der tatsächlichen Ausführung eine Dateisystemsperre erwirbt biberund diese Sperre anschließend freigibt.

Implementierung:

  1. 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/biberanzupassen .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

  1. Führen Sie mit dem folgenden Befehl so viele Instanzen aus, latexmkwie Sie möchten. Bitte beachten Sie, dass $HOME/bindurch 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>

verwandte Informationen