Keine solche Datei, wenn sie existiert

16

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/binist die phantomjsDatei, 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

Sig
quelle
Lassen Sie uns die Ausgabe von ls -lF /usr/local/phantomjs/bin/phantomjssowie sehen lf -lF /usr/local/phantomjs/bin. Bitte bearbeiten .
Ein Lebenslauf
1
Hoppla. Ja, das habe ich wirklich gemeint ls -lF. Entschuldigung für die Verwirrung! Können wir auch die Ausgabe von file /usr/local/phantomjs/bin/phantomjsbitte sehen, und wenn das etwas wie "Text" oder "Skript" sagt, auch head -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).
Ein CVn
1
Okay, nicht das, was ich erwartet hatte, aber hilfreich. Da Sie lsaber nicht filesofort verfügbar sind, vermute ich jetzt, dass Ihre $PATHnicht vollständig besiedelt ist. Mal sehen echo $PATH, um das zu bestätigen; Ich vermute, es wird /binaber /usr/binfür den Anfang nicht enthalten. Es ist auch möglich, dass andere Teile Ihrer Umgebung (z. B. $LD_LIBRARY_PATH) aus demselben Grund $PATHunvollständig sind, der zu Unvollständigkeit führt, aber $PATHauf 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.
Ein Lebenslauf
siehe Update3. Zu Ihrer Information rubyfunktioniert wie erwartet. Das Problem ist nur mit phantomjs.
Sig
Okay, das ist eigentlich seltsam. Hoffentlich kann jemand die so gefundenen Details aufnehmen und das beobachtete Verhalten tatsächlich beschreiben, da mir im Moment die Ideen ausgehen, die ich ausprobieren kann.
Ein Lebenslauf

Antworten:

6

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

execve("/usr/local/phantomjs/bin/phantomjs", ["/usr/local/phantomjs/bin/phantom"...], [/* 13 vars */]) = -1 ENOENT (No such file or directory)

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.

strings /usr/local/phantomjs/bin/phantomjs | less

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.

$ file modetest
modetest: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.0, stripped

$ strings modetest | less
/lib/ld-linux-armhf.so.3    <=
libdrm.so.2    <=
drmModeFreeObjectProperties
drmModeFreePlaneResources
_ITM_deregisterTMCloneTable
 ...
libpthread.so.0    <=
pthread_join
pthread_create
__errno_location
 ...
libc.so.6    <=
strcpy
exit
mmap64
 ...

Von Ihrem vorherigen Update2 wäre die erste Datei /lib64/ld-linux-x86-64.so.2 .


Sägespäne
quelle
1
@macsig - Siehe Anhang.
Sägemehl
Vielen Dank für Ihre ausführliche Antwort. Ich habe das Problem gelöst, indem ich anstelle der "Standard" -Version eine alpine spezifische PhantomJS-Version installiert habe (die nach einer Weile des Googelns gefunden wurde).
Sig
Aus bestimmten Gründen funktioniert es nicht auf alpinen. Ich habe diesen Befehl / Repo verwendet: 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
Boop