upgreat-readable/pku

Ошибки выполнения в windows среде

Closed this issue · 18 comments

На версиях 1.0.5, 1.0.6 у меня ошибка выполнения команды (Windows 10, WSL2):


wsl ./pku start --mode algorithmic --count 300 --type train --lang ru --time
/bin/bash: ./pku: /bin/bash^M: bad interpreter: No such file or directory

image

Коллеги, это ошибка имеется при попытке использования в 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 найти где она происходит?

Все исходные файлы находятся в репозитории и доступны для редактирования.

На сколько я понял проблему:

Гипотеза: когда вы клонируете репозиторий, у вас 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 не меняет ошибку

При выполнении локально, после билда, ошибка не найден сокет для подключения:
image
Видимо в образе докера установлена другая точка входа, а не та что я нашел в файле 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.1.0 при выполнении команды wsl ./pku start --mode algorithmic --count 300 --type train --lang rus --time 100 ошибка The session was not started. но я вижу открытую сессию в кабинете

image
image

в логах докера так же ошибки:

image

Под версией 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, это видно и в консоли докера. Итак остается два вопроса:

  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 пока идей нет.

  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 повторить поведение.
Можно попробовать покопать несколько гипотез.

  1. Проверка прав и владельца
    Выполните команды из корня проекта
# проверяем нумерованный id пользователя в wsl окружении
ls -nal

# заходим в контейнер
docker-compose exec node-pku bash

# проверяем нумерованный id пользователя в docker окружении
ls -nal

Права должны совпадать

  1. Продебажить метод указанный выше в файле 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:
image

Но PWD действительно нигде не объявлена, а с неё начинались эти пути в вашем варианте

С этими изменениями в .yaml файлы наконец-то начали появляться в папке репозитория pku:
image

Получается, осталось определиться с .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 для корректной работы.