Wie ist das möglich?
bash: /usr/local/phantomjs/bin/phantomjs: No such file or directory
bash-4.3# cd /usr/local/phantomjs/bin
bash-4.3# ls
phantomjs
bash-4.3#
Der Inhalt von /usr/local/phantomjs/bin
ist die phantomjs
Datei, aber wenn ich versuche, sie auszuführen, sieht es so aus, als ob sie nicht existiert.
Zu Ihrer Information, ich bin auf Alpine Linux 3.3
Update1
bash-4.3# ls -lF /usr/local/phantomjs/bin/phantomjs
-rwxr-xr-x 1 root root 67932064 Jan 25 2016 /usr/local/phantomjs/bin/phantomjs*
bash-4.3# lf -lF /usr/local/phantomjs/bin
bash: lf: command not found
bash-4.3# ls -lF /usr/local/phantomjs/bin
total 66340
-rwxr-xr-x 1 root root 67932064 Jan 25 2016 phantomjs*
Update2
bash-4.3# file /usr/local/phantomjs/bin/phantomjs
bash: file: command not found
bash-4.3# head -n1 /usr/local/phantomjs/bin/phantomjs
ELF>xvA@`�
Q�t/lib64/ld-linux-x86-64.so.2GNUGNU����!�`�L`�L^|��������h�TT@T@DD`��`�L`�P�tddB�dB�dB��g
Update3
bash-4.3# echo $PATH
/usr/local/phantomjs/bin:/usr/local/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bash-4.3# ruby -v
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
Update4
bash-4.3# strace /usr/local/phantomjs/bin/phantomjs
execve("/usr/local/phantomjs/bin/phantomjs", ["/usr/local/phantomjs/bin/phantom"...], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
writev(2, [{"strace: exec: No such file or di"..., 39}, {"\n", 1}], 2strace: exec: No such file or directory
) = 40
writev(2, [{"", 0}, {NULL, 0}], 2) = 0
getpid() = 12
exit_group(1) = ?
+++ exited with 1 +++
Vielen Dank
alpine-linux
Sig
quelle
quelle
ls -lF /usr/local/phantomjs/bin/phantomjs
sowie sehenlf -lF /usr/local/phantomjs/bin
. Bitte bearbeiten .ls -lF
. Entschuldigung für die Verwirrung! Können wir auch die Ausgabe vonfile /usr/local/phantomjs/bin/phantomjs
bitte sehen, und wenn das etwas wie "Text" oder "Skript" sagt, auchhead -n1 /usr/local/phantomjs/bin/phantomjs
. Ich habe eine Hypothese, die sie möglicherweise bestätigen oder verfälschen würde (oder uns zumindest in die richtige Richtung weisen würde).ls
aber nichtfile
sofort verfügbar sind, vermute ich jetzt, dass Ihre$PATH
nicht vollständig besiedelt ist. Mal sehenecho $PATH
, um das zu bestätigen; Ich vermute, es wird/bin
aber/usr/bin
für den Anfang nicht enthalten. Es ist auch möglich, dass andere Teile Ihrer Umgebung (z. B.$LD_LIBRARY_PATH
) aus demselben Grund$PATH
unvollständig sind, der zu Unvollständigkeit führt, aber$PATH
auf einen Blick leicht zu überprüfen ist. Wenn man sich en.wikipedia.org/wiki/Alpine_Linux ansieht , könnte der Minimalismus der Alpen hier ein Faktor sein.ruby
funktioniert wie erwartet. Das Problem ist nur mitphantomjs
.Antworten:
Die Shell meldet ein mehrdeutiges " Keine solche Datei oder kein solches Verzeichnis " für eine ausführbare Datei, wenn die Shell keine Abhängigkeit für diese ausführbare Datei finden kann.
Die fehlende Abhängigkeit ist normalerweise eine erforderliche gemeinsam genutzte Bibliothek oder ein dynamischer Loader.
Verwenden Sie den Befehl strace, um den Systemaufruf open () explizit anzuzeigen, der während der Ausführungsanforderung fehlschlägt (z
strace /usr/local/phantomjs/bin/phantomjs
. B. ).Nachtrag
Der evecve syscall hat den Fehlercode ENOENT zurückgegeben, den die Manpage als "Der Dateiname der Datei oder ein Skript oder ELF-Interpreter existiert nicht oder eine für Datei oder Interpreter benötigte gemeinsam genutzte Bibliothek kann nicht gefunden werden" beschreibt.
Normalerweise habe ich gesehen, dass strace eine bessere Auflösung der fehlenden Datei bietet.
Der nächste Schritt besteht darin, die ausführbare Datei auf ihre Abhängigkeiten zu untersuchen.
Verwenden Sie den Befehl strings , um den dynamischen Linker / Loader, die gemeinsam genutzten Bibliotheken und die Einstiegspunkte zu extrahieren, die am Anfang der ausführbaren Datei aufgeführt sind.
Für jeden Dateinamen , den Sie in dieser Liste identifizieren können, müssen Sie dann überprüfen, ob die Datei in Ihrem Root-Dateisystem installiert ist.
Von Ihrem vorherigen Update2 wäre die erste Datei /lib64/ld-linux-x86-64.so.2 .
quelle
curl -Lo phantom.tgz https://github.com/DarthHater/docker-phantomjs2/releases/download/2.1.1/dockerized-phantomjs.tar.gz | tar xf -C /
dann können Sie verwenden/usr/local/bin/phantomjs