7

Как это возможно?

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 +++

Спасибо

1 ответ1

2

Оболочка сообщит о неоднозначном « Нет такого файла или каталога » для исполняемого файла, когда оболочка не может найти зависимость для этого исполняемого файла.
Отсутствующая зависимость обычно является обязательной разделяемой библиотекой или динамическим загрузчиком.

Используйте команду strace для явного просмотра системного вызова open(), который завершается с ошибкой во время выполнения запроса (например, 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 возвратил код ошибки ENOENT, который на странице руководства описывается как «файл с именем файла или сценарий или интерпретатор ELF не существует, или не найдена общая библиотека, необходимая для файла или интерпретатора».

Обычно я видел, как strace обеспечивает лучшее разрешение отсутствующего файла.
Следующим шагом является проверка исполняемого файла на предмет его зависимостей.
Используйте команду strings для извлечения динамического компоновщика / загрузчика, общих библиотек и точек входа, перечисленных в начале исполняемого файла.

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

Для каждого имени файла, которое вы можете идентифицировать в этом списке, вы должны убедиться, что файл установлен в вашей корневой файловой системе.

$ 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
 ...

Из предыдущего обновления 2 первый файл будет /lib64/ld-linux-x86-64.so.2.


Всё ещё ищете ответ? Посмотрите другие вопросы с метками .