Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумРазбор ошибок

На машине работает, на сервере нет

Костя Фомин
Костя Фомин
Знаток
сообщений 1600
с апр
15 ноября, 14:22первое сообщение

Классика, но я застрял. Скрипт обхода на ноутбуке отрабатывает весь список из 12 тысяч адресов без единого отказа. Тот же скрипт, тот же файл, тот же интерпретатор по версии, залит на сервер и запущен под systemd: первые сотни три проходят, дальше сплошные 403.

Из консоли на сервере, руками, тот же скрипт работает нормально. Ломается он только когда его запускает служба. Файл один, машина одна, поведение разное.

Понимаю, что дело в окружении, но не понимаю, как это поймать, чтобы не гадать.

stackfix
stackfix
Участник
сообщений 495
с окт
22 апреля, 17:39#2

Гадать тут нечего, эту задачу закрывают сравнением. Ловушка в том, что сравнивать надо всё подряд, включая скучное. Виновата обычно самая незаметная строчка, на которую взгляд не задерживается.

Три уровня сравнения, по возрастанию мороки.

Первый, дешёвый: снимите переменные с обоих запусков и разложите рядом. Из-под службы окружение куда беднее консольного, потому что профиль оболочки там никто не читает.

# в скрипт временно, самой первой строкой
env | sort > /tmp/env-$(id -un)-$$.txt

Второй: версии всего, что участвует. Интерпретатор, библиотека обхода, библиотека шифрования, хранилище корней. Совпадение по главной версии ничего не значит, разница вылезает на младших.

Третий, самый честный: снимите сырой запрос с обоих запусков и сравните побайтно. Всё, что скрипт реально отправил, видно только там. Заголовки, их порядок, кодировки, имя клиента.

Начните с первого, в девяти случаях из десяти он и закрывает вопрос.

пишу скрипты, чтобы не писать скрипты
Костя Фомин
Костя Фомин
Знаток
сообщений 1600
с апр
1 сентября, 08:56#3

Снял. Разница в двенадцать строк, из них половина про пути. И ещё вот это:

< HTTP_PROXY=http://10.0.0.9:3128
< HTTPS_PROXY=http://10.0.0.9:3128
< NO_PROXY=localhost,127.0.0.1

Треугольные скобки означают, что в окружении службы их нет вовсе.

Егор Пастухов
Егор Пастухов
Новичок
сообщений 78
с июл, второй сезон
8 февраля, 11:13#4

то есть из-под службы он ходил напрямую? а сайт это заметил?

okhotnik
okhotnik
Участник
сообщений 720
с авг
15 июля, 14:30#5

Именно так и заметил. Триста обращений подряд с одного адреса за пару минут любая площадка видит без труда, дальше 403 до конца прогона.

Чтобы убедиться окончательно, снимите сырой запрос обоими способами. Ставите слушателя на порт и направляете скрипт в него, всё видно на экране.

сырой запрос из консоли и из-под службы
сырой запрос из консоли и из-под службы

Заодно увидите порядок заголовков, он тоже бывает разным у разных сборок библиотеки.

nastroyka_pro
nastroyka_pro
Ветеран
сообщений 2110
с мар
22 декабря, 17:47#6

Костя, лечится в два касания.

Переменные для службы задаются в самом юните, профиль оболочки systemd не открывает и открывать не будет. Держите их отдельным файлом, так удобнее менять без правки юнита:

[Service]
EnvironmentFile=/etc/progon/okruzhenie
ExecStart=/opt/progon/venv/bin/python /opt/progon/obhod.py

В /etc/progon/okruzhenie кладёте те самые три строки. Права на файл поставьте 600, там пары входа.

И второе, по существу прогона: с одного адреса 12 тысяч обращений подряд гонять смысла нет, вы просто повторите ту же историю чуть позже. Я под такие списки беру приватные серверные адреса с безлимитным трафиком и ставлю ротацию внутри пула, тогда счётчик на стороне площадки просто не набирается.

stackfix
stackfix
Участник
сообщений 495
с окт
1 мая, 08:04#7
nastroyka_pro: профиль оболочки systemd не открывает

Вот этот пункт стоит выписать на бумажку и повесить над столом. Он же ловит людей на cron, там ровно та же беда с урезанным окружением.

пишу скрипты, чтобы не писать скрипты
Костя Фомин
Костя Фомин
Знаток
сообщений 1600
с апр
8 октября, 11:21#8

Отчитываюсь, всё сошлось.

Проблема была ровно в трёх переменных. Из консоли я заходил своим пользователем, у которого они лежали в профиле, поэтому руками всё летало. Служба стартовала с голым окружением и честно ходила напрямую с адреса сервера. Триста обращений это как раз тот порог, после которого площадка перестала пускать.

Сделал файл окружения и подключил его в юнит. Прогон на 12 тысяч прошёл целиком, отказов ноль, время почти как на ноутбуке. Ротацию по пулу тоже включил, чтобы не упираться в счётчик на длинных списках.

Что помогло больше всего: сравнение окружений в лоб, через env с обеих сторон. Две минуты работы, а искал я до этого полдня в коде скрипта, где смотреть было вообще нечего.