Keine solche Datei, wenn sie existiert

4274
Sig

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 /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}, ], 2) = 0 getpid() = 12 exit_group(1) = ? +++ exited with 1 +++ 

Vielen Dank

6
Sehen wir uns die Ausgabe von 'ls -lF / usr / local / phantomjs / bin / phantomjs' sowie `lf -lF / usr / local / phantomjs / bin 'an. Bitte [bearbeiten]. a CVn vor 7 Jahren 0
Siehe update1. Vielen Dank Sig vor 7 Jahren 0
Hoppla. Ja, ich meinte wirklich 'ls -lF'. Entschuldigung für die Verwirrung! Können wir auch die Ausgabe von `file / usr / local / phantomjs / bin / phantomjs` sehen, und wenn das etwas wie" Text "oder" Skript "sagt, auch` head -n1 / usr / local / phantomjs / bin / Phantomjs ". Ich habe eine Hypothese, und dies würde sie möglicherweise bestätigen oder verfälschen (oder uns zumindest in die richtige Richtung bewegen). a CVn vor 7 Jahren 1
Siehe Update2. Vielen Dank Sig vor 7 Jahren 0
Okay, nicht was ich erwartet hatte, aber hilfreich. Da Sie "ls", aber nicht "file" sofort verfügbar haben, vermute ich jetzt, dass Ihr "$ PATH" nicht vollständig belegt ist. Sehen wir uns `echo $ PATH` an, um das zu bestätigen. Ich vermute, es wird `/ bin` enthalten, aber nicht` / usr / bin` für den Anfang. Es ist auch möglich, dass andere Teile Ihrer Umgebung (z. B. "$ LD_LIBRARY_PATH") aus dem gleichen Grund unvollständig sind, weshalb "$ PATH" unvollständig ist. "$ PATH" ist jedoch auf einen Blick leicht zu überprüfen. Beim Blick auf https://en.wikipedia.org/wiki/Alpine_Linux könnte Alpines Minimalismus hier eine Rolle spielen. a CVn vor 7 Jahren 1
siehe Update3. Zu Ihrer Information "Ruby" funktioniert wie erwartet. Das Problem betrifft nur "Phantomjs". Sig vor 7 Jahren 0
Okay, das ist eigentlich seltsam. Hoffentlich kann jemand die gefundenen Details nehmen und das Verhalten tatsächlich beschreiben, da mir die Ideen im Moment ausgehen. a CVn vor 7 Jahren 0
Es ist Python kompiliert und ist angeblich eigenständig, setzt aber "auf Fontconfig (das Paket fontconfig oder libfontconfig, je nach Verteilung)." Ein Hinweis? Keine Ahnung! Http://phantomjs.org/download.html Yorik vor 7 Jahren 0
Bitte geben Sie die Ausgabe von `uname -m` und` file / usr / local / phantomjs / bin / phantomjs` an. Ich kenne dieses verwirrende Verhalten, wenn Sie versuchen, ein Binärprogramm auszuführen, das für eine andere CPU-Architektur als die aktuelle Maschine kompiliert wurde. Wie haben Sie das binäre `phantomjs` installiert / erhalten? mpy vor 7 Jahren 0
Ok, ich habe gerade gesehen, dass Sie `file` nicht installiert haben, aber die Überschrift identifiziert die Binärdatei bereits als x86_64-Programmdatei. mpy vor 7 Jahren 0

1 Antwort auf die Frage

2
sawdust

Die Shell meldet ein mehrdeutiges " Keine solche Datei oder Verzeichnis " für eine ausführbare Datei, wenn die Shell keine Abhängigkeit für diese ausführbare Datei findet.
Die fehlende Abhängigkeit ist normalerweise eine erforderliche gemeinsam genutzte Bibliothek oder ein dynamischer Lader.

Verwenden Sie den Befehl strace, um explizit den open () -Syscall 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) 

Evecve syscall hat den Fehlercode ENOENT zurückgegeben, der in der Manpage als " Dateiname oder Skript oder ELF-Interpreter nicht vorhanden ist oder eine gemeinsam genutzte Bibliothek für Datei oder Interpreter nicht gefunden werden konnte."

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.
Mit dem Befehl strings können Sie den dynamischen Linker / Loader, die gemeinsam genutzten Bibliotheken und Einstiegspunkte 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 angeben können, müssen Sie ü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 .


@macsig - Siehe Nachtrag. sawdust vor 7 Jahren 0
Vielen Dank für Ihre ausführliche Antwort. Ich habe das Problem gelöst, indem ich eine Alpine-spezifische PhantomJS-Version (die nach einer Weile gefunden wurde) anstelle der "Standard" -Version installiert hat. Sig vor 7 Jahren 0
Aus einigen Gründen funktioniert es nicht auf alpinen Gebieten. 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` / usr / local / bin / phantomjs` verwenden Boop vor 6 Jahren 0