これはどのようにして可能ですか?
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#
/usr/local/phantomjs/bin
の内容はphantomjs
ファイルですが、実行しようとすると、存在しないようです。
参考までに、私は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 +++
ありがとう
シェルは、実行可能ファイルの依存関係を見つけることができない場合、実行可能ファイルのあいまいな "No such file or directory"を報告します。
通常、不足している依存関係は、必要な共有ライブラリまたはダイナミックローダーです。
straceコマンドを使用して、実行リクエスト中に失敗したopen() syscallを明示的に表示します(例: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)
Evecve syscallがエラーコードENOENTを返しました。これは、manページに「ファイルfilenameまたはスクリプトまたはELFインタープリターが存在しないか、共有されているファイルまたはインタープリターに必要なライブラリーが見つかりません。」
通常、straceを使用すると、不足しているファイルの解像度が向上します。
次のステップは、実行可能ファイルの依存関係を調べることです。
stringsコマンドを使用して、実行可能ファイルの先頭にリストされている動的リンカー/ローダー、共有ライブラリ、およびエントリポイントを抽出します。
strings /usr/local/phantomjs/bin/phantomjs | less
このリストで識別できるfilenameごとに、ファイルがルートファイルシステムにインストールされていることを確認する必要があります。
$ 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
...
以前のUpdate2の場合、最初のファイルは/ lib64/ld-linux-x86-64.so.2になります。