Ошибки выполнения в windows среде
Closed this issue · 18 comments
Коллеги, это ошибка имеется при попытке использования в windows платформе, связана с символом переноса каретки.
Почитайте, там в т.ч. указаны способы решения:
https://stackoverflow.com/questions/14219092/bash-script-and-bin-bashm-bad-interpreter-no-such-file-or-directory
https://qastack.ru/ubuntu/304999/not-able-to-execute-a-sh-file-bin-bashm-bad-interpreter
Напоминаем что работа платформы гарантируется при использовании linux как хостовой машины.
https://github.com/upgreat-readable/pku/blob/master/docs/platform.md
Спасибо, @north-leshiy я читал эти иссью, организаторы конкурса разрешили самостоятельно исправлять эти ошибки и делать pull-request, проблема в том что мне не понятно в каком модуле происходит ошибка, у вас все модули с открытым кодом? Я смогу через debug найти где она происходит?
Все исходные файлы находятся в репозитории и доступны для редактирования.
На сколько я понял проблему:
- проблема вот в этом файле
- это проблема переноса строк. Сейчас переносы строк в файле сделаны \n.
Гипотеза: когда вы клонируете репозиторий, у вас git/windows конвертирует его в \r\n. Т.е. проблема появляется во время клонирования.
Спасибо, выполнение wsl sed -i -e 's/\r$//' ./pku
решило проблему, в ответ получено error: option '--time <time>' argument missing
. Файл pku теперь отмечен как модифицированный, но где разница не показывает. если добавить --time 100, то ничего не выводит. Означает ли это что клиент соединился с сервером в инструкции сказано, что в папке files/in должны начать появляться файлы...
Выполнение wsl ./pku getNextFile
приводит к ошибке:
error: ENOENT: no such file or directory, scandir 'files/in/' Во время получения файла произошла ошибка
Я так понимаю, что это уже файл GetNextFileService.ts но исправление 11ой строки на './files/in/' и перезапуск через docker-compose up -d --force-recreate
не меняет ошибку
При выполнении локально, после билда, ошибка не найден сокет для подключения:
Видимо в образе докера установлена другая точка входа, а не та что я нашел в файле SocketIoClient.ts адрес 'http://ds.readable.upgreat.one/pku', И из crome ws-консоли по этому адресу так же не подключиться.
Ещё в логах контейнера докера ошибка: error: При старте сессии произошла ошибка {"message":"params.language must be one of the following values: rus, eng, all"}
я пробовал как ключ --lang ru, так и --lang rus
Под версией 1.2.0 то же самое:
info: ## socket connection to server detected ##
info: received event of : ipc.session-start {
mode: 'algorithmic',
type: 'train',
count: '300',
lang: 'rus',
time: '60',
demo: false
}
debug: IPC server handle: ipc.session-start
info: socket disconnected false
info: Сессия успешно подключилась 157
info: dispatching event to socket : start-feedback-to-command true
info: server socket error Error: This socket has been ended by the other party
at Socket.writeAfterFIN [as write] (net.js:452:14)
at Server.emit (/app/node_modules/node-ipc/dao/socketServer.js:101:12)
at IPCServer.sendToClient (/app/build/connections/IPCServer.js:97:27)
at Socket. (/app/build/service/SessionService.js:71:29)
at Socket.Emitter.emit (/app/node_modules/component-emitter/index.js:133:20)
at Socket.onevent (/app/node_modules/socket.io-client/lib/socket.js:278:10)
at Socket.onpacket (/app/node_modules/socket.io-client/lib/socket.js:236:12)
at Manager. (/app/node_modules/component-bind/index.js:21:15)
at Manager.Emitter.emit (/app/node_modules/component-emitter/index.js:133:20)
at Manager.ondecoded (/app/node_modules/socket.io-client/lib/manager.js:345:8) {
code: 'EPIPE'
}
info: Стал доступен файл 0002502 в сессии @todo
error: файл 0002502 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0002502.json'
info: Стал доступен файл 0001168 в сессии @todo
error: файл 0001168 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0001168.json'
Файл pku теперь отмечен как модифицированный, но где разница не показывает.
В настройках гита можно установить показывать переносы строк
если добавить --time 100, то ничего не выводит
После обновления до 1.1.0 при выполнении команды wsl ./pku start --mode algorithmic --count 300 --type train --lang rus --time 100 ошибка The session was not started. но я вижу открытую сессию в кабинете
В последних версиях мы добавили фидбек командам. В ближайшей версии дополнительные информационные уведомления будут стабильными.
И из chrome ws-консоли по этому адресу так же не подключиться.
Используется протокол socket.io. Это не чистые вебсокеты, высокоуровневая абстракция которая позволяет работать в т.ч. с fallback режимом в виже long pulling. Попробуйте клиента socket.io на том языке на котором вы привыкли писать.
Ещё в логах контейнера докера ошибка: error: При старте сессии произошла ошибка {"message":"params.language must be one of the following values: rus, eng, all"} я пробовал как ключ --lang ru, так и --lang rus
Исправлено в одной из последних версий. Мы изменили протокол названия языков и выпустили в тот день новую версию.
Под версией 1.2.0 то же самое:
Попробуйте заново скачать проект и запустить с --force-recreate
Проверьте что образ у вас именно версии 1.2.0 или выше командой docker-compose images
Спасибо, @north-leshiy проверил текущий image 1.2.1, это видно и в консоли докера. Итак остается два вопроса:
- Файлы не приходят, в консоли докера ошибки:
debug: IPC server handle: ipc.session-start
info: Сессия успешно подключилась 166
info: dispatching event to socket : start-feedback-to-command true
info: socket disconnected false
info: Стал доступен файл 0001682 в сессии @todo
error: файл 0001682 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0001682.json'
info: Стал доступен файл 0001750 в сессии @todo
error: файл 0001750 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0001750.json'
info: Стал доступен файл 0003095 в сессии @todo
error: файл 0003095 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0003095.json'
info: Стал доступен файл 0002095 в сессии @todo
error: файл 0002095 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0002095.json'
info: Стал доступен файл 0001270 в сессии @todo
error: файл 0001270 не был сохранен с ошибкойENOENT: no such file or directory, open 'files/in/0001270.json'
Из предыдущих разбирательств проверил windows права на папку, права всем и полные, через wsl так же полные права:
C:\NodejsProjects\upgreat-readable\pku>wsl ls -l files
total 0
drwxrwxrwx 1 antropit antropit 4096 Oct 20 21:16 custom
drwxrwxrwx 1 antropit antropit 4096 Oct 13 13:05 in
drwxrwxrwx 1 antropit antropit 4096 Oct 13 13:05 out
Больше по п.1 пока идей нет.
- Допустим, chrome-консоль неподходит, но почему не происходит соединение с сервером при запуске локального экземпляра, ведь это копия того что в образе докера?
C:\NodejsProjects\upgreat-readable\pku>node build/bin/pku.js reconnect
Ошибка: Не найден сокет для подключения к демону
Допустим, chrome-консоль неподходит, но почему не происходит соединение с сервером при запуске локального экземпляра, ведь это копия того что в образе докера?
Докер запускает демон процесс index.js в папке build. Запустите сначала его, после этого у вас возможно получится в windows окружении получить аналогичный процесс.
А как правильно его запускать? Я запустил index.js в параллельной консоли, но ошибка Не найден сокет для подключения к демону
не меняется.
C:\NodejsProjects\upgreat-readable\pku>node build/index.js
{"message":"starting server on /tmp/ipc.sock ","level":"info"}
{"message":"starting TLS server false","level":"info"}
{"message":"starting server as Unix || Windows Socket","level":"info"}
{"message":"## socket connection to server detected ##","level":"info"}
{"message":"socket disconnected false","level":"info"}
{"message":"## socket connection to server detected ##","level":"info"}
{"message":"socket disconnected false","level":"info"}
{"message":"## socket connection to server detected ##","level":"info"}
{"message":"socket disconnected false","level":"info"}
При повторной попытке запустить сервер из первой консоли выкидывает с ошибкой, что адрес занят, значит сервер виден из первой консоли, но это не помогло почему-то
{"message":"server error Error: listen EADDRINUSE: address already in use \\\\.\\pipe\\tmp-ipc.sock\n\u001b[90m at Server.setupListenHandle [as _listen2] (net.js:1209:19)\u001b[39m\n\u001b[90m at listenInCluster (net.js:1274:12)\u001b[39m\n\u001b[90m at Server.listen (net.js:1373:5)\u001b[39m\n at Server.startServer (C:\\NodejsProjects\\upgreat-readable\\pku\\node_modules\\\u001b[4mnode-ipc\u001b[24m\\dao\\socketServer.js:315:21)\n\u001b[90m at FSReqCallback.oncomplete (fs.js:153:23)\u001b[39m {\n code: \u001b[32m'EADDRINUSE'\u001b[39m,\n errno: \u001b[32m'EADDRINUSE'\u001b[39m,\n syscall: \u001b[32m'listen'\u001b[39m,\n address: \u001b[32m'\\\\\\\\.\\\\pipe\\\\tmp-ipc.sock'\u001b[39m,\n port: \u001b[33m-1\u001b[39m\n}","level":"info"}
Файлы не приходят, в консоли докера ошибки:
Нам не удается в нативном варианте linux + docker повторить поведение.
Можно попробовать покопать несколько гипотез.
- Проверка прав и владельца
Выполните команды из корня проекта
# проверяем нумерованный id пользователя в wsl окружении
ls -nal
# заходим в контейнер
docker-compose exec node-pku bash
# проверяем нумерованный id пользователя в docker окружении
ls -nal
Права должны совпадать
- Продебажить метод указанный выше в файле SocketIoClient
Для этого переключите в ENV в разработческий конфиг (конфиг dev прокидывает папки с локальной машины) и перезапустите контейнер
COMPOSE_FILE=.docker/docker-compose.yaml:.docker/docker-compose-dev.yaml
Запустите компилятор в режиме мониторинга изменений
tsc --watch
Возможно проблема в разных путях для работы под windows.
Можете попробовать обработать рекомендации по кроссплатформенной разработке и прислать pull request.
Гипотеза в том что нужно обернуть в path.join
| path.normalize
. (файл src/connections/SocketIoClient.ts)
Сейчас команда сосредоточена на приоритетных задачах, доработки под windows платформу мы делаем с более низким приоритетом.
Я запустил index.js в параллельной консоли, но ошибка Не найден сокет для подключения к демону не меняется.
Почему то команда не видит файл сокета по пути /tmp/ipc.sock. Проверьте наличие файла. Если он есть - попробуйте продебажить этот момент со стороны клиента src/connections/IPCClient.ts.
Отлично @north-leshiy диагностика показала, что внутри образа контейнера создается своя files, а не прокидывается с компа как должно было быть, после выполнения chmod под правами рута права на запись появляются, но она пустая и если создать в ней папку in, то файлы начинают складываться, но естественно снаружи контейнера пришедших файлов не видно. И где папка находится ненашел, но при перезапуске файлы и настройки прав сохраняются, значит она не внутри образа. Поэтому пытаюсь настроить путь в .yaml файле, чтоб они приходили в репозиторий.
Работает вариант с ..
volumes:
- '../files:/app/files'
- '../logs:/app/logs'
Так же обратил внимание что при сборке warning:
Но PWD действительно нигде не объявлена, а с неё начинались эти пути в вашем варианте
С этими изменениями в .yaml файлы наконец-то начали появляться в папке репозитория pku:
Получается, осталось определиться с .yaml файлом и $PWD где и как её задавать
@antropit Дайте вывод команды пжл
env | grep -i PWD
По умолчанию должна быть текущая папка в bash
PWD=/home/north/projects/pku
OLDPWD=/home/north/projects
C:\NodejsProjects\upgreat-readable\pku>wsl env | wsl grep -i PWD
PWD=/mnt/c/NodejsProjects/upgreat-readable/pku
C:\NodejsProjects\upgreat-readable\pku>wsl docker-compose exec -u 0 node-pku bash
root@c3d001794600:/app# env | grep -i PWD
PWD=/app
root@c3d001794600:/app#
@antropit возможно стоит посмотреть вот в эту сторону
https://stackoverflow.com/questions/63552052/docker-volumes-on-windows-wsl2
Там ссылка на документацию best practices для работы docker в windows.
Не рекомендуют использовать примонтированные в linux директории из windows для корректной работы.