Задать вопрос
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если приложение, запущенное через &, попробует написать что-то в консоль, то при невозможности написать в эту консоль начнутся проблемы (приложение словит SIGHUP или SIGPIPE). Решение - перенаправить явно весь вывод в /dev/null:

    command > /dev/null 2> /dev/null &

    Вместо двух перенаправлений в /dev/null можно одно перенаправление в /dev/null и одно в другой:

    command > /dev/null 2>&1 &

    Так делать в подобной ситуации необязательно, но часто делают, и полезно знать. Также надо понимать, что запись:

    > file

    эквивалентна:

    >1 file

    А запись:

    < file

    эквивалентна:

    <0 file

    Всё потому, что стандартные файловые идентификаторы такие: 0 - stdin, 1 - stdout, 2 - stderr.

    Также бывают проблемы, когда приложение хочет что-то прочитать с консоли. Можно ему и на вход передать тоже /dev/null:

    command > /dev/null 2> /dev/null < /dev/null &

    Но даже в таком случае при закрытии консоли bash пошлёт висящему в фоне процессу SIGHUP. Чтобы это не случилось, нужно сделать disown сразу после выполнения команды, и это можно сделать в той же строке:

    command > /dev/null 2> /dev/null < /dev/null & disown


    Всё это можно сделать одной командой nohup, которая упрощает все эти действия и вывод записывет в файл nohup.out:

    nohup command &

    Подробнее в man, он довольно короткий и рассказывает всё в деталях.

    Иногда приложения не могут работать совсем без терминала, в этом случае их можно запускать в в screen/tmux или docker.

    Я не просто так рассказываю: понимать теорию очень полезно, в том числе теперь, надеюсь, не возникнет вопроса, почему длительные и просто даже критические к прерыванию операции настоятельно советуют запускать в screen, а не полагаться на то, что они успешно завершатся без отваливания консоли, и добавление & тут ничего не гарантирует!

    Но всё же, совет сразу же научиться использовать systemd (а в других операционных системах и дистрибутивах - возможно свои другие системы управления сервисами) - он ОЧЕНЬ ПРАВИЛЬНЫЙ. Это сложно только в первый раз :)

    Также в особых случаях можно ограничиться специализированными менеджерами типа supervisor или pm2. Особыми являются только случаи, когда подобные менеджеры уже используются для запуска других сервисов, с нуля их использовать при наличии универсального и хорошо работающего systemd практически лишено смысла.
    Ответ написан
    Комментировать
  • Как организовать передачу файлов с FTP сервера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Самый простой и удобный способ - поднять рядом с ftp http-сервер. Можно даже с паролем (http basic auth).
    Ответ написан
    1 комментарий
  • Python какой хостинг подойдет, и в чем проблема?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В pythonanywhere в бесплатном тарифе ограничен список адресов, на которые можно ходить https://www.pythonanywhere.com/whitelist/ . Кроме того, браузер сам по себе очень тяжёлый, в бесплатных хостингах даже если и удастся его поставить, он упрётся в лимиты по памяти.

    Правильно арендовать VPS. Можно найти весьма недорогие, есть целый ряд сайтов с рейтингами и ценами хостеров. На пиво и сигареты в месяц больше уходит (кроме тех, кто не курит и не пьёт).
    Ответ написан
  • Есть ли сервисы по отправке SMS по API с тестовым периодом?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В настоящее время скорее нет, чем да.

    Сейчас все крупные мобильные операторы требуют регистрации имени с предоставлением документов о товарном знаке, имени сайта итд итп. У некоторых это требует абонентской платы (обычно порядка 2 тыс. рублей в месяц), у некоторых даже бесплатно, но ритуал соблюсти всё равно надо.

    Единственное что можно тут сделать - выяснить у поставщика, нет ли у него возможности отправки на какого-нить не очень крупного оператора (MVNO?), у которого купить симку и на этом номере тестироваться с каким-нить общим именем типа "sms info". Но в целом для выхода в прод регистрация имени всё равно потребуется.
    Ответ написан
    Комментировать
  • Персональный гугл, если ли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для того, чтобы просканить интернет, нужно для начала иметь список интернет-сайтов и страниц на них. Это уже огромный объём информации, которую поисковики накапливали годами и поддерживают в актуальном состоянии.

    Но даже если такой список есть - по нему ещё надо пройтись. Потратив уйму времени на скачивания этих миллиардов страниц. И возможно в итоге получить 0 результатов. А на следующий запрос начинать скачивать всё то же самое заново повторно.

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

    А искать по всему интернету в личных целях могут только настоящие поисковики. Ну вот можно разве пытаться их результаты обрабатывать и фильтровать, но это уже не будет поиск своими силами.
    Ответ написан
    1 комментарий
  • Что такое inline_query запрос и как отправить его боту?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У ботов есть интерфейс, который помогает пользователю написать новое сообщение. Для этого надо ввести в любом чате имя бота в начале (@###bot) и какой-то текст, секунду спустя бот вернёт список вариантов для использования. Например, @vid "текст" сделает поиск видео на YouTube и покажет варианты. Пользователь может выбрать вариант и отправить его в текущий чат, а может не выбрать - бот об этом не узнает.

    Пример
    65c3cc74bef59374568860.png


    Как вариант, можно посмотреть моего бота glagolitic_bot, который помогает писать в чатах глаголицей, тифинагицей, коптицей и ивритицей. Ссылка на исходный код есть в описании бота.

    Чтобы бот мог работать в таком режиме, его надо включить у BotFather (Bot Settings - Inline Mode). Надо ещё не забывать, что Телеграм может кэшировать такие подсказки бота.
    Ответ написан
    Комментировать
  • Есть ли возможность перенаправить человека в telegram с заготовленным сообщением?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Такой возможности нет. Можно передать текст в аргумент команды start бота. Больше информации в официальной документации https://core.telegram.org/api/links

    Возможно, более разумным является веб-логин через Телеграм на самом сайте или, например, использование Web App в самом Телеграме. Но это надо существенно пересматривать всё взаимодействие с пользователем.
    Ответ написан
    Комментировать
  • Как выйти из двух пользователей в Linux, и при этом выполнить команду один раз?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет, ведь такая команда будет исполняться в одном shell, а не в двух разных. После первого exit дальше уже всё, остаток будет проигнорирован.

    Способы есть:

    1. Из суперпользователя убить shell пользователя. Некрасиво и неудобно, но закроет оба шелла.

    2. Переключение в суперпользователя оформить сразу с выходом, тогда выход из внутреннего сделает выход и из внешнего, например:

    sudo -i; exit

    Недостаток - если не удастся правильно ввести пароль - сразу же и выкинет. Ну, можно поразбираться с кодами возврата, чтобы не делать exit.

    3. Вместо предыдущего можно сделать exec, тогда запускаемая команда заместит текущий shell, а не будет запущена как дочерний процесс:

    exec sudo -i

    Недостаток тот же - если не ввести правильно пароль, то выкинет.

    Но в целом я не вижу во всём этом смысла. Выход можно делать комбинацией Ctrl-D. Нажать дважды Ctrl-D ничто не мешает, это даже удобнее.
    Ответ написан
    2 комментария
  • Как найти петлю в локальной сети?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если сеть на неупралвяемом оборудовании, то wireshark в лучшем случае позволит понять, какой мак-адрес больше всех флудит в сеть. Иногда даже по вендору мак-адреса можно угадать, что это. Но в целом это бесполезное занятие.

    Нужно разбирать сеть на части и смотреть, в какой петля сохраняется. Так и выявить местонахождение заразы.
    Ответ написан
  • Почему в моем тесте go быстрее c?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лет 20 назад коллеги сравнили реализации рекурсивного Фибоначчи на C и Java и Java оказалась быстрее (!!!). Декомпиляция показала, что gcc тех лет вставляет в тело каждой функции сохранение некоторых регистров типа push di; pop di; хотя в таком простом коде это вообще не имело смысла. А подобные мелочи могут реально съедать часть процессорного времени в достаточном количестве, чтобы показывать неожиданные результаты.

    Если скомпилировать какой-нить простой цикл с оптимизацией -O2 и тем более -O3, то нередко компилятор, например, заменит N итераций цикла на N/4 или N/8, в каждой из которых будет по 4 или 8 операций. Потому что в силу особенностей современных процессоров это может оказаться вычислительно эффективнее. Программист бы никогда так не написал, а компилятор улучшает его код и делает быстрее. Компиляторы в языки более высокого уровня и даже интерпретаторы байткода на таких мелочах иногда неожиданно выигрывают.

    Надо вникать, что именно получилось на выходе в обоих случаях. Может, рекурсия в go уже не рекурсия, а хвостовая рекурсия? Или вместо far call используются near call, которые быстрее? Или даже как таковых вызовов нет? А может там лишнее время съедает динамическая линковка при запуске, которая в go меньше выражена (а при сборке в статический бинарник вообще отсутствует)?
    Ответ написан
    Комментировать
  • Как сделать нумерацию начинающуюся с нуля каждый год?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Самое простое решение такое. Делаем sequence, из которого при вставке заполняем нужный номер явным вызовом nextval или дефолтным значением/триггером. И каждый год 1 января сбрасываем sequence в 0. Зачем слишком усложнять-то?
    Ответ написан
  • Почему перемещение объявления и инициализации переменной на новую строчку кода влияет на результат работы программы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В этом коде есть важная ошибка. В циклах for нигде не задано начальное значение переменной i, поэтому она может иметь любое значение, её поведение неопределено. Например, она может выделиться там же, где была выделена предыдущая, поэтому i во втором цикле будет равна последнему значению в предыдущем, то есть 10, даже если в первом цикле повезло попасть на 0.

    Локальные переменные как правило выделяются в стеке, поэтому если между двумя for стоит определение ещё одной переменной, то она, вероятно, выделится на месте i. И поэтому новая переменная i попадёт в другую часть стека, где, если повезёт, будет 0.

    Поэтому неудивительно, что поведение различаетя. Ведь оно в принципе не определено. В разных аппаратно-программных платформах и с разными компиляторами поведение может оказаться самым непредсказуемым. Например, в памяти может остаться мусор от предыдущей программы.

    Решение простое: надо везде в циклах for указать начальное значение i, тогда всё станет нормально, и перестановка определения count перестанет создавать такие совсем не странные эффекты.
    Ответ написан
    3 комментария
  • Как сделать, чтобы бизнес-аккаунт выглядел вот так, а не просто номер вверху?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно зарегаться официально через одного из партнёров WA https://www.facebook.com/business/partner-director..., предоставить документы и пройти верификацию для "зелёной галочки". Дальше работать через API этого партнёра либо через какую-то готовую интеграцию (их есть для разных CRM, чат-ботов итд).

    Собственно, на экране видно предупреждение, что используются услуги сторонних компаний.
    Ответ написан
    Комментировать
  • Как при переходе по ссылке в телегамм бот автоматически вызывать команду /start?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак нельзя. Это же мечта любого спамера - чтобы пользователь не мог избежать действия.
    Ответ написан
    Комментировать
  • Как удалить последние 2 сообщения в телеграм боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, бот может удалять только свои сообщения, но не сообщения от пользователя.
    Ответ написан
  • Где можно хранить данные, которые тг-бот использует в работе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Хранить картинки в git-репе проекта - это обычно плохая идея, кроме случаев, когда их совсем немного. Хранить их в каталоге рядом с ботом - нормальная.

    Но если картинки для разных пользователей будут повторяться, то лучше запоминать file_id ранее загруженных, чтобы в следующий раз не отправлять сами файлы. Это ускорит отправку, да и Телеграму лишние копии файлов на их серверах ни к чему.

    spoiler
    У меня есть бот, у которого в репе лежит несколько картинок, плюс он помнит в своей базе, какие уже отправлял, чтобы передавать их только по file_id https://github.com/shurshur/glagolitic-bot/blob/ma...
    Ответ написан
    Комментировать
  • Как скопировать файл на ext4 image без прав root?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, можно, используя debugfs:

    $ dd if=/dev/zero of=test.img bs=1M count=10
    $ mkfs.ext4 test.img
    $ debugfs -w test.img
    debugfs: write my_file.txt new_file.txt
    Ответ написан
    1 комментарий
  • Как привязать postgis к postgres в docker?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно просто использовать образ postgis вместо образа postgres. Образ postgis/postgis унаследован от postgres и вполне его заменяет.
    Ответ написан
    2 комментария
  • Как решить проблему, если телеграм-бот выдаёт ошибку Task exception was never retrieved и не отправляет файл в чат повторно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Дело в том, что photo это file handle, после того файл один раз прочитан, его надо переоткрыть заново сначала. Так что надо считывать прям внутри обработчика, а не снаружи.
    Ответ написан
    Комментировать
  • Как исправить код на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сейчас запущено два бота с одним токеном одновременно либо, как вариант, что-то идёт не так при запросе, и бот делает второй-третий-четвёртый запрос getUpdates слишком часто. Но я думаю что скорее всего первый вариант, ибо это довольно частая ошибка новичков.
    Ответ написан
    Комментировать