хз что делает код, но создай его перед тем как к нему обращаться
Ошибка именно в run, и когда выполняется mysqldump уже в файл, то ошибка что файла нет типа. Хотя на хостинге он есть! Ну и на локалке все работает.
В линуксе файловая система case sensitive, на маке — нет. Когда-то я на такое напарывался в паре iOS/симулятор, с тех пор запомнил. Проверь этот момент.
Тогда почему проходит проверку на то что файл есть, а эта ошибка уже появляется в run где и идет попытка в этот файл запихнуть результат mysqldump
Путь к файлу абсолютный или относительный?
Вапор под рутом работает?
Так точно
Фу как отвратительно! :)
Путь такой - /root/project/Public/backups/admin_default/2023-11-30_17-54-03/product_enum.sql
Там вообще ошибка не от самого процеса, а от свифта. Точно такая команда есть?
Так на локалке бекапы создаются и все идеально работает!
На маке процес вапора может наследовать PATH и соотвественно mysqldump, а на линуксе нет и нужно прописать полный путь к экзекютаблу
Покажи-ка полный код где задается Process
Попробуй слогировать путь команды, которая запускается и попробовать в терминале просто запустить
Удваиваю. На 80 процентов уверен, что либо путь относительный типа ../ либо еще что-то что не допустимо в иерархии файловой системы Линукса.
Слушай, ну и это тоже плохая практика. PATH был придуман для людей, чтобы не набирать полный путь запускаемой программы/команды каждый раз. Когда же ты один раз и навсегда прописываешь ее вызов где-либо — в коде или в скрипте — то надо прописывать с полным путем, тогда получаются одни плюсы: 1. Сокращается время запуска (системе не надо шарить по директориям PATH) 2. Ты точно знаешь, что запустится именно та версия, что ты указал, а не какая-либо другая, "случайно" оказавшаяся в PATH раньше нужной, что случается чаще, чем можно было бы подумать. Это не тот случай, когда стОит экономить буквы.
На самом деле по этому коду хз что pathToMySQL делает, может там и полный путь
-e /{path-to-file}/{file-name}.{file-extension} ] && echo "File exists" || echo "File does not exist"
Та просто ровно ту же команду вставить, и посмотреть какой вывод будет
Лишь бы команда лишнего не наделала :)
Вот именно что хз. И нахер оно нужно — тоже хз. which mysqldump , а результат в код.
Хардкодить пути - тоже не лучшый вариант)
Плюсы я написал, допиши теперь минусы :)
Запускаем на другом серваке, где mysqldump закинуло не в /usr/bin/, а к примеру в /usr/local/bin и ловим ошибку)
Тут же все поклонники докера, такого быть не может :)
На маке у себя для теста не сможешь запустить
У меня так же:)
у меня пути идут из ключей и/или env vars, но так да, лучше полные пути
Ну так найдется хоть один минус? :)
Не настраивается. Например нужно будет собрать форк этого weasyprint - как его подсунуть своему приложению, рекомпилить?
Принято. Но всегда можно предусмотреть сначала брать из env для таких случаев.
Попробовал все сработало корректно:(
Проверил, Process оказался под пользователем root
А в свифте выбивает ошибку Error task.run save и тд?
На локалке вообще все хорошо срабатывает, только на хостинге проблема. В логе ничего не пишет, а перехват ошибки дает вот это - Error Domain=NSCocoaErrorDomain Code=260 "The file doesn’t exist."
На каком моменте эта ошибка?
Да, где? Это про дамп?
В task.run()
mysqldump
Да, но… может это относится к testSaveBase.sql? Директория где он должен быть создан доступна для записи? Проверен этот момент. Либо это про то что mysqldump бинарь не находится. Бывает что от ординарного юзера работает без явного указания пути, а под рутом нужен полный абсолютный путь. Это уже выше советовали…
Везде права -rw-rw-rw- И при ручном бекапе и когда перед бекапом создаются пустые файлы
Полный путь к mysqldump известен?
Упс сейчас этот момент проверю!
ОГРОМНОЕ СПАСИБО! Дело было в неправильном пути до mysqldump на сервере!
В смысле. Это ж первое, о чем начали говорить еще 2 часа назад 🙈
Ну, ёлки-палки 3 человека написали включая меня про необходимость такой проверки…
Что-то я жестко тупанул получается, извиняюсь!
Пока просматривал, увидел что некоторые разрабы разделяют код по виду запуска, под MacOS вариант как у вас, а под Linux используют Process.launchPath and Process.launch() вместо .run() И по по-разному методы эти работают: один thread создает, другой форкает процесс.
Как минимум на линуксе разницы между ними нет. launch запускает run
Обсуждают сегодня