Иногда бывает ситуация когда dev-сервер по какой-либо причине не закрылся и висит в процессах, занимая порт.
Это может быть из-за падения IDE или просто сам забыл погасить и закрыл терминал.
Для таких случаев я набросал простую функцию с командой:
Если во время старта dev-сервера получаете ошибку что порт уже занят, просто выполните команду, подставив свой порт.
Bash
Имя команды можете изменить на любое другое.
#linux
Это может быть из-за падения IDE или просто сам забыл погасить и закрыл терминал.
Для таких случаев я набросал простую функцию с командой:
kill_on_port() {
port=$(lsof -t -i:$1)
echo "KILL PROCESS:" $port
sudo kill -9 $port
}
alias killonport="kill_on_port $@"
Код поместить в ~/.bashrc и рестартнуть систему.Если во время старта dev-сервера получаете ошибку что порт уже занят, просто выполните команду, подставив свой порт.
Bash
kill_on_port 8000Скорее всего бесполезно, если другой процесс назначен на перезапуск вашего dev-сервера в случае падения.
Имя команды можете изменить на любое другое.
#linux
А знаете ли вы, что в Bash есть особая переменная "$_" ? Из описания можно узнать, что в переменную "$_" помещается последний аргумент последней команды.
Что-то знакомое? Конечно, в Python есть примерно тоже самое.
Мы знаем, что дата первого релиза Bash (8 июня 1989) несколько раньше чем первый релиз Python (20 февраля 1991). Если учесть, что по задумке автора Python это агрегация самых успешных практик отовсюду, можно ли сказать что именно эта фишка к нему пришла из Bash? Ни подтверждения ни опровержения я пока не нашел.
Давайте просто считать это совпадением 😉
А как это может быть полезно в Bash?
Приведу простой пример, который оценят те, кто часто работает в терминале.
Допустим, нам надо создать директорию и зайти в неё. Что обычно делаем?
PS.
Символы "&&"" разделяют команды и означают, что требуется выполнить вторую команду только если первая завершилась успешно.
#linux #tricks
Что-то знакомое? Конечно, в Python есть примерно тоже самое.
Мы знаем, что дата первого релиза Bash (8 июня 1989) несколько раньше чем первый релиз Python (20 февраля 1991). Если учесть, что по задумке автора Python это агрегация самых успешных практик отовсюду, можно ли сказать что именно эта фишка к нему пришла из Bash? Ни подтверждения ни опровержения я пока не нашел.
Давайте просто считать это совпадением 😉
А как это может быть полезно в Bash?
Приведу простой пример, который оценят те, кто часто работает в терминале.
Допустим, нам надо создать директорию и зайти в неё. Что обычно делаем?
:~$ mkdir foldernameКак это сделать в одну команду?
:~$ cd foldername
:~/foldername$
:~$ mkdir foldername && cd foldernameУже лучше, но хочется короче, без повторов. Вот тут и пригодится наша переменная. Напомню, что в неё сохраняется последний аргумент предыдущей команды.
:~/foldername$
:~$ mkdir foldername && cd $__________________
:~/foldername$
PS.
Символы "&&"" разделяют команды и означают, что требуется выполнить вторую команду только если первая завершилась успешно.
#linux #tricks
Python + bash
Если вам часто требуется запускать shell команды из Python-кода, какой способ вы используете?
Самый низкоуровневый это функция
Советую обратить своё внимание на очень крутую библиотеку sh.
Что она умеет?
🔸 удобный синтаксис вызова команд как функций
🔸 удобный вызов команд от sudo
А вот вариант с вводом пароля через код.
Специально для Windows💀 юзеров
#libs #linux
Если вам часто требуется запускать shell команды из Python-кода, какой способ вы используете?
Самый низкоуровневый это функция
os.system(), либо os.popen(). Рекомендованный способ это subprocess.call(). Но это всё еще достаточно неудобно.Советую обратить своё внимание на очень крутую библиотеку sh.
Что она умеет?
🔸 удобный синтаксис вызова команд как функций
# os🔸 простое создание функции-алиаса для длинной команды
import os
os.system("tar cvf demo.tar ~/")
# subprocess
import subprocess
subprocess.call(['tar', 'cvf', 'demo.tar', '~/'])
# sh
import sh
sh.tar('cvf', 'demo.tar', "~/")
fn = sh.lsof.bake('-i', '-P', '-n')
output = sh.grep(fn(), 'LISTEN')
в этом примере также задействован пайпинг🔸 удобный вызов команд от sudo
with sh.contrib.sudo:Такой запрос спросит пароль. Чтобы это работало нужно соответствующим способом настроить юзера.
print(ls("/root"))
А вот вариант с вводом пароля через код.
password = "secret"Это не все фишки. Больше интересных примеров смотрите в документации.
sudo = sh.sudo.bake("-S", _in=password+"\n")
print(sudo.ls("/root"))
Специально для Windows💀 юзеров
#libs #linux
GitHub
GitHub - amoffat/sh: Python process launching
Python process launching. Contribute to amoffat/sh development by creating an account on GitHub.
Наверняка у многих возникло желание потестить отправку сообщений, но Redis не установлен и вообще непонятно как с ним быть.
На самом деле запустить его очень просто.
🔸 Для Windows, качаем архив, запускаем redis-server.exe
🔸 Для Linux несколько команд
🔸 Если есть Docker, то еще проще
______________________
А еще с сервером можно поиграть в пинг-понг
На самом деле запустить его очень просто.
🔸 Для Windows, качаем архив, запускаем redis-server.exe
🔸 Для Linux несколько команд
🔸 Если есть Docker, то еще проще
docker run --rm -p 6379:6379 redisВсё, можно экспериментировать!
______________________
А еще с сервером можно поиграть в пинг-понг
> redis-cli ping#tricks #libs #linux
PONG
Я нашел самый быстрый способ поднять свой независимый и бесплатный VPN
Сразу оговорка, платить придётся только за хостинг.
1️⃣ Покупаем сервер где-то на просторах интернета. Конечно же сервер должен находиться за пределами страны. Например я закупился на https://eurohoster.org/ (не реклама). Проверяйте лимиты по трафику, в идеале - без ограничений.
2️⃣ Ставим docker
Самый простой способ поднять сервис WireGuard c WebUI это проект wg-easy
Код и документация здесь
https://github.com/weejewel/wg-easy
Запускаем контейнер:
https://github.com/weejewel/wg-easy#2-run-wireguard-easy
Для тех кто с DockerCompose, забираем файл здесь:
https://gist.github.com/paulwinex/be87f79687b96786098ec8fa6a8e251c
В обоих случаях потребуется поменять две переменные:
Остальные параметры указаны ниже на странице github https://github.com/weejewel/wg-easy#options
4️⃣ Ставим клиента
Все доступные клиенты здесь
https://www.wireguard.com/install/
Есть возможность добавить клиента в Network Manager для управления подключением через UI. Установка зависит от вашей системы, ищите мануалы в сети, их много.
https://github.com/max-moser/network-manager-wireguard
Скрипт установки для RasperryPi
https://gist.github.com/paulwinex/c2c4090f19dbe8bd1253c5744f3f06e1
ЗЫ. Конечно же это не "самый простой" и далеко не единственный способ. А просто тот, который использую я сам.
#offtop #linux
Сразу оговорка, платить придётся только за хостинг.
1️⃣ Покупаем сервер где-то на просторах интернета. Конечно же сервер должен находиться за пределами страны. Например я закупился на https://eurohoster.org/ (не реклама). Проверяйте лимиты по трафику, в идеале - без ограничений.
2️⃣ Ставим docker
sudo apt install docker.ioЕсли удобней с DockerCompose то ставим и его
sudo apt install docker-compose3️⃣ Ставим WG-EASY
Самый простой способ поднять сервис WireGuard c WebUI это проект wg-easy
Код и документация здесь
https://github.com/weejewel/wg-easy
Запускаем контейнер:
https://github.com/weejewel/wg-easy#2-run-wireguard-easy
Для тех кто с DockerCompose, забираем файл здесь:
https://gist.github.com/paulwinex/be87f79687b96786098ec8fa6a8e251c
В обоих случаях потребуется поменять две переменные:
WG_HOST - внешний статичный IP вашего сервераPASSWORD - придумайте пароль для WEB UIОстальные параметры указаны ниже на странице github https://github.com/weejewel/wg-easy#options
4️⃣ Ставим клиента
Все доступные клиенты здесь
https://www.wireguard.com/install/
Есть возможность добавить клиента в Network Manager для управления подключением через UI. Установка зависит от вашей системы, ищите мануалы в сети, их много.
https://github.com/max-moser/network-manager-wireguard
Скрипт установки для RasperryPi
https://gist.github.com/paulwinex/c2c4090f19dbe8bd1253c5744f3f06e1
ЗЫ. Конечно же это не "самый простой" и далеко не единственный способ. А просто тот, который использую я сам.
#offtop #linux
GitHub
GitHub - WeeJeWel/wg-easy: The easiest way to run WireGuard VPN + Web-based Admin UI.
The easiest way to run WireGuard VPN + Web-based Admin UI. - WeeJeWel/wg-easy
👍18🔥2
В Linux стандартными средствами можно использовать часть оперативной памяти как диск. Для этого требуется указать тип монтирования
▫️ Скорость работы с таким каталогом выше чем многие SSD и тем более HDD.
▫️ Если у вас очень быстрый SSD на NVMe M.2 то такой способ особо не прибавит вам скорости, но поможет сохранить ресурс SSD когда требуется обрабатывать очень много мелких файлов и оперативка позволяет выделить нужный объем.
▫️ Оперативка это энергозависимая память, поэтому выключении питания все файлы безвозвратно теряются. Такой "non persistent" каталог гарантирует удаление временных файлов.
Я написал небольшой скрипт для условного теста и сравнения скорости копирования файлов между SSD и RAM.
Вот мои результаты:
На моём железе прирост скорости ~2x. Плюс экономия ресурса SSD.
В Windows такой фишки по умолчанию нет, но обязательно найдутся аналогичные решения
#linux #triks
tmpfs в команде mountmount -t tmpfs -o size=5G tmpfs /mnt/ramТеперь путь
/mnt/ram можно использовать как обычный каталог. Для чего это может быть нужно?▫️ Скорость работы с таким каталогом выше чем многие SSD и тем более HDD.
▫️ Если у вас очень быстрый SSD на NVMe M.2 то такой способ особо не прибавит вам скорости, но поможет сохранить ресурс SSD когда требуется обрабатывать очень много мелких файлов и оперативка позволяет выделить нужный объем.
▫️ Оперативка это энергозависимая память, поэтому выключении питания все файлы безвозвратно теряются. Такой "non persistent" каталог гарантирует удаление временных файлов.
Я написал небольшой скрипт для условного теста и сравнения скорости копирования файлов между SSD и RAM.
Вот мои результаты:
Single File Size: 30.0GbСкрипт для теста ↗️
ssd > ssd: 0:00:12.850 / 2.3Gb/s
sdd > ram: 0:00:06.453 / 4.6Gb/s
ram > ram: 0:00:06.995 / 4.3Gb/s
ram > sdd: 0:00:06.217 / 4.8Gb/s
Dir size: 32.7Gb, File count: 11127
ssd > ssd: 0:00:15.063 / 2.2Gb/s
sdd > ram: 0:00:08.486 / 3.9Gb/s
ram > ram: 0:00:08.032 / 4.1Gb/s
ram > sdd: 0:00:07.026 / 4.7Gb/s
На моём железе прирост скорости ~2x. Плюс экономия ресурса SSD.
В Windows такой фишки по умолчанию нет, но обязательно найдутся аналогичные решения
#linux #triks
Gist
Test copy speed with ramdisk on linux
Test copy speed with ramdisk on linux. GitHub Gist: instantly share code, notes, and snippets.
👍9🔥2❤1
reload_flag=""
if [[ -n "${DEBUG}" ]]; then
reload_flag="--reload"
fi
if [[ -n "${WORKER_COUNT}" ]]; then
workers=${WORKER_COUNT}
else
workers=2
fi
gunicorn --workers ${workers} \
--bind 0.0.0.0:8000 \
${reload_flag} main.wsgi
Писали такие конструкции чтобы проверить наличие флага и сформировать команду правильно?
На самом деле можно сделать тоже самое проще. Для этого используются операторы условной подстановки, доступные в оболочках семейства POSIX.
:- для установки значений по умолчанию${WORKER_COUNT:-2}Если переменная не объявлена, то будет дефолтное значение 2.
:+ подставляет указанный текст, если переменная не пуста${DEBUG:+--reload}Если что-то есть в переменной то распечатается текст после символа
+, в противном случае - ничего. Удобно для опциональных флагов, как в нашем примере.Итого наш скрипт может выглядеть так:
gunicorn --workers ${WORKER_COUNT:-2} \
--bind 0.0.0.0:8000 \
${DEBUG:+--reload} main.wsgiЕсть еще два оператора.
:= не только подставить дефолтное значение, но и присвоить его переменной, если она пуста# никаких переменных еще нет
VAL1=${VAL2:=hello}
# теперь доступны обе
echo $VAL1 $VAL2
# hello hello
:? остановить выполнение с ошибкой, если переменной нет.echo ${MISS:?is required}
bash: MISS: is requiredКод выхода будет 1.
#tricks #linux
👍5
А что происходит на противоположном фронте?
Вы, вероятно, слышали, что 2026 год называют годом Linux на десктопе (в каких-то узких кругах - годом гейминга на Linux). Всё потому, что экосистема Linux постепенно становится более дружелюбной для обычных десктоп-юзеров (в том числе привыкших к Windows), и не только!
▫️ всё чаще появляются Linux дистрибутивы визуально похожие на Windows (или даже лучше), и множество видео с советами какой дистрибутив попробовать новичкам.
▫️ обновления ядра и любых пакетов в экосистеме Linux всегда привносят оптимизацию и удобство и поддержку свежего железа (привет винде с её обратной тенденцией). Например грядущая версия 7.0, опять с множеством приятных мелочей.
▫️ после 10 лет с последего релиза версии 5 окружение KDE Plasma получила мажорный апдейт версии 6 и активно развивается (уже доросла до 6.5). GNOME тоже не спит и готовит версию 50.
▫️ в Wine добавили патч позволяющий устанавливать продукты Adobe на Linux. Для кого-то это был последний рубеж?😏
▫️ Proton активно развивается, да так, что через эту прослойку игры работают даже быстрей чем нативно на винде.
▫️ с каждым релизом Wine и Proton поддерживается всё больше игр, что можно отслеживать на ProtonDB, и даже случаются бусты производительности.
▫️ Я сам на днях на виндобук поставил ChacyOS после чего игры, которые тянули гдето в 5-10 FPS, стали играбельными! Подтверждено личным опытом! Кстати, есть несколько дистрибутивов заточенные именно под игры.
▫️ Valve выпускают новую пачку железок которые (предположительно) порвут рынок гейминга (как и в прошлый раз) и (определнно точно) работают на Linux. Именно Valve вливает ресурсы в Linux в целом и в Proton в частности.
▫️ Госсектор разных стран давно уже мигрирует на opensource, так как нет доверия системе которая может одномоментно неконтролируемо массово рухнуть или быть удаленно заблокированной (в том числе по политическим причинам).
И ниже небольшой опрос - какая у вас операционка основная?
#offtop #linux
Вы, вероятно, слышали, что 2026 год называют годом Linux на десктопе (в каких-то узких кругах - годом гейминга на Linux). Всё потому, что экосистема Linux постепенно становится более дружелюбной для обычных десктоп-юзеров (в том числе привыкших к Windows), и не только!
▫️ всё чаще появляются Linux дистрибутивы визуально похожие на Windows (или даже лучше), и множество видео с советами какой дистрибутив попробовать новичкам.
▫️ обновления ядра и любых пакетов в экосистеме Linux всегда привносят оптимизацию и удобство и поддержку свежего железа (привет винде с её обратной тенденцией). Например грядущая версия 7.0, опять с множеством приятных мелочей.
▫️ после 10 лет с последего релиза версии 5 окружение KDE Plasma получила мажорный апдейт версии 6 и активно развивается (уже доросла до 6.5). GNOME тоже не спит и готовит версию 50.
▫️ в Wine добавили патч позволяющий устанавливать продукты Adobe на Linux. Для кого-то это был последний рубеж?😏
▫️ Proton активно развивается, да так, что через эту прослойку игры работают даже быстрей чем нативно на винде.
▫️ с каждым релизом Wine и Proton поддерживается всё больше игр, что можно отслеживать на ProtonDB, и даже случаются бусты производительности.
▫️ Я сам на днях на виндобук поставил ChacyOS после чего игры, которые тянули гдето в 5-10 FPS, стали играбельными! Подтверждено личным опытом! Кстати, есть несколько дистрибутивов заточенные именно под игры.
▫️ Valve выпускают новую пачку железок которые (предположительно) порвут рынок гейминга (как и в прошлый раз) и (определнно точно) работают на Linux. Именно Valve вливает ресурсы в Linux в целом и в Proton в частности.
▫️ Госсектор разных стран давно уже мигрирует на opensource, так как нет доверия системе которая может одномоментно неконтролируемо массово рухнуть или быть удаленно заблокированной (в том числе по политическим причинам).
И ниже небольшой опрос - какая у вас операционка основная?
Ни к чему не призываю, ничего не советую! Просто подмечаю тенденцию и хочется узнать мнения из первых рук 😉
Знаю, что Linux тоже не идеален, знаю что каждой задаче - свой инструмент. Но это не тема поста, так что можно без холиваров)
#offtop #linux
Хабр
Почему 2026-й станет годом десктопного Linux + интересные дистрибутивы внутри
Есть все признаки того, что 2026 год наконец-то станет годом десктопного Linux . Ниже — разбор причин этого сдвига и обзор перспективных дистрибутивов для игр, максимальной производительности и...