Mit einem scheinbar harmlosen Skript, das ich habe, passiert etwas Seltsames. Ich muss eine Reihe von Dateien an einige Stellen im System kopieren und habe dafür das folgende Skript.
#!/bin/bash
# Get all the files from the file
LINES=$(cat Release-Nodejs/dependencies.txt)
# Copy each file to its location as indicated in the file
for LINE in ${LINES}
do
LIBRARY=$(basename ${LINE})
LIBRARY=Release-Nodejs/${LIBRARY}
LIB_PATH=$(dirname ${LINE})
echo -e "Copying \e[38;5;10m${LIBRARY}\e[0m to \e[38;5;11m${LIB_PATH}\e[0m"
cp ${LIBRARY} ${LIB_PATH}
done
Das Skript ruft die Dateien und Speicherorte aus der dependencies.txt
Datei ab, deren Inhalt lautet:
/usr/lib/x86_64-linux-gnu/libnode.so.72
/lib/x86_64-linux-gnu/libgcc_s.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1
/usr/lib/x86_64-linux-gnu/libbrotlidec.so.1
/usr/lib/x86_64-linux-gnu/libbrotlienc.so.1
/usr/lib/x86_64-linux-gnu/libcares.so.2
/usr/lib/x86_64-linux-gnu/libnghttp2.so.14
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
/usr/lib/x86_64-linux-gnu/libssl.so.1.1
/usr/lib/x86_64-linux-gnu/libicui18n.so.67
/usr/lib/x86_64-linux-gnu/libicuuc.so.67
/lib/x86_64-linux-gnu/libdl.so.2
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/lib/x86_64-linux-gnu/libm.so.6
/usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1
/usr/lib/x86_64-linux-gnu/libicudata.so.67
Wenn ich die Zeile auskommentiere, cp ${LIBRARY} ${LIB_PATH}
erhalte ich:
Ich weiß also, dass ich die Dateinamen und Pfade richtig bekomme. Wenn ich die cp ${LIBRARY} ${LIB_PATH}
Zeile auskommentiere und das Skript sudo
damit ausführe, zerstört das Skript mein System(das ist übrigens harmlos, weil ich das auf einer VM teste). Wenn ich das mache, wird der Bildschirm einfach schwarz und ich muss das VM-Fenster zwangsweise schließen. Wenn ich dann versuche, die VM erneut auszuführen, erhalte ich Folgendes:
Und ich muss UBUNTU komplett neu installieren.
Ich frage mich, warum dies passiert, da ich es cp
für jede Datei manuell in der Befehlszeile ausführen kann und nichts Schlimmes passiert, die Dateien werden einfach an ihre Ziele kopiert.
BEARBEITEN:
Wie in einem der Kommentare und in derXY-Problem, das Problem, das ich zu lösen versuche, besteht darin, dass ich auf meiner Maschine ein natives Node.JS-Modul erstelle, das über verfügt node v12.18.1
und das auf einer Maschine mit verwendet werden soll, node v 10.19.0
und ich kann die Node-Version auf der Zielmaschine absolut nicht aktualisieren oder andere Pakete installieren, die die Abhängigkeiten enthalten.
Bei der Ausführung ldd mymodule.node
erhalte ich:
linux-vdso.so.1 (0x00007ffe878c6000)
libnode.so.72 => /usr/lib/x86_64-linux-gnu/libnode.so.72 (0x00007f9bd34fb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9bd34e0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9bd34be000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9bd32d4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9bd5b1e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9bd32b7000)
libbrotlidec.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f9bd32a9000)
libbrotlienc.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlienc.so.1 (0x00007f9bd3215000)
libcares.so.2 => /usr/lib/x86_64-linux-gnu/libcares.so.2 (0x00007f9bd31fe000)
libnghttp2.so.14 => /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007f9bd31d2000)
libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f9bd2ef5000)
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f9bd2e61000)
libicui18n.so.67 => /usr/lib/x86_64-linux-gnu/libicui18n.so.67 (0x00007f9bd2b4f000)
libicuuc.so.67 => /usr/lib/x86_64-linux-gnu/libicuuc.so.67 (0x00007f9bd2961000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9bd295b000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9bd277a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9bd262b000)
libbrotlicommon.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f9bd2608000)
libicudata.so.67 => /usr/lib/x86_64-linux-gnu/libicudata.so.67 (0x00007f9bd0aed000)
Und deshalb versuche ich, das zu tun, was ich in dieser Frage versuche. Die eigentliche Frage hier ist also:Wie kann ich diese Abhängigkeiten zusammen mit dem .node
Modul einbinden, sodass ich es bereitstellen kann, ohne etwas auf dem Ziel aktualisieren zu müssen?
Ich würde es vorziehen, all dies in das Modul einzubinden und nur eine .node-Datei zu haben, die alles enthält und nicht von Systembibliotheken abhängt, aber ich glaube nicht, dass das möglich ist, oder doch?
Antwort1
Sie könnten es noch einmal versuchen, aber erstellen Sie das Verzeichnis „mkdir -p /usr/local/lib/nodejs“ und setzen Sie Ihren LIBPATH auf „export LIBPATH=/usr/local/lib/nodejs/“. Ich empfehle Ihnen jedoch dringend, zu lesen, wie Sie nodejs unter Linux installieren, bevor Sie loslegen. Siehe beispielsweise „https://github.com/nodejs/help/wiki/Installation#how-to-install-nodejs-via-binary-archive-on-linux“ – dort wird die Installation in „/usr/local/lib/nodejs“ durchgeführt. Die einzige schwere Arbeit, die Sie nach dem Erstellen des Verzeichnisses erledigen müssen, ist das Herunterladen der Binärdatei und das Entpacken in das Verzeichnis „/usr/local/lib/nodejs“.