LinuxCamp | DevOps – Telegram
LinuxCamp | DevOps
14.2K subscribers
194 photos
7 videos
300 links
Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование.

Админ (реклама): @XoDefender
Чат: @linuxcamp_chat

Менеджер: @Spiral_Yuri
Биржа: https://telega.in/c/linuxcamp_tg

№ 6327102672
Download Telegram
Инъекция пользы

Если хотим передать файлы или каталоги с локальной системы на удаленный ssh сервер или наоборот, используем команды: scp и sftp.

Скопируем файл с удаленного хоста в локальный каталог:


$ scp user@host:/path/to/file /local/dir


Скопируем файлы с локального компьютера на удаленный хост:


$ scp /local/dir/file user@host:/remote/dir


Скопируем файл с одного удаленного хоста на другой:


$ scp user1@host1:/remote/file user2@host2:/remote/dir


Прога sftp не требует постоянно указывать адрес ssh сервера. Вместо этого мы подключаемся к нему один раз и используем интерфейс get и put:


$ sftp user@host
sftp> get /remote/dir/file /local/dir
sftp> put /local/dir/file /remote/dir


Для передачи каталогов используем флаг "-r":


$ scp -r /local/dir user@host:/remote/dir
$ sftp> put -r /local/dir /remote/dir


Также хочется отметить, что sftp имеет важное преимущество перед обычным ftp — она не требует, чтобы на удаленном узле работал сервер FTP. Ей необходим только SSH.

LinuxCamp | #microhelp
👍33🔥28❤‍🔥41😁1
Итоги квартала

По традиции набросал сводку ключевых постов (декабрь - февраль 2025):

Сигналы

1. Отправка сигналов: kill()
2. Отправка сигнала самому себе: raise()
3. Защита от незваных гостей: сигнальная маска
4. Работа с ожидающими сигналами
5. Перехватывай сигналы, как профи: sigaction()
6. Функции для работы с набором сигналов

Потоки ввода-вывода

1. Потоки ввода-вывода: stdout, stderr, stdin
2. Операторы перенаправления ввода-вывода: >, >>
3. Операторы перенаправления ввода-вывода: <, <<
4. Операторы перенаправления ввода-вывода: |

Оболочка

1. Шаблоны командной оболочки: *, ?, []
2. Вычисление переменных в оболочке
3. Условные списки: ||, &&
4. Подстановка вывода команды: $()
5. Передача команды в качестве bash аргумента
6. Выполнение команды в подоболочке: ()
7. Расширение команд с помощью {}

Задания

1. Фоновое выполнение команд и задания
2. Команды управления заданиями: fg, bg, jobs
3. Проблема с вводом-выводом в фоновом выполнении

Разбор команд

1. Автоматизация задач с xargs
2. Xargs и флаги: -L, -t
3. Практика использования xargs
4. Управление буфером обмена: xclip
5. Прокачиваемся в grep
6. Просмотр файлов: head и tail
7. Прокачиваемся в find
8. Прокачиваемся в cp
9. Настройка прав по умолчанию: umask
10. Прокачиваемся в tr

Базовый linux:

1. Раскрываем завесу тайн над устройствами
2. Что такое /dev/null и почему туда направляют данные?

Личные практики:

1. Не самый стандартный способ использовать syslog
2. Как я потрошил iso образ
3. Как получить доступ к данным iso образа?

Рекомендации

1. Топ ресурсов по изучению Linux

LinuxCamp | #sumup
1🔥57👍24❤‍🔥42
Перемещайся по файловой системе как флеш: CDPATH

Многие из вас умеют быстро ходить по файловой системе через автодополнение пути по TAB, использование '~' для указания домашнего каталога или команде "cd -", которая позволяет переключаться между текущим и прежним каталогами:


$ cd -
/home/xoadmin/Documents

$ cd -
/home/xoadmin/Music


Но этого мало для того, чтобы считать себя профи. Предположим, у вас есть важный каталог "/home/smith/Family/Memories/Photos", который вы часто посещаете.

Скорее всего, чтобы попасть в него, вы введете путь:


$ cd ~/Family/Memories/Photos


Да, но было бы круто сократить этот путь до Photos, независимо от того, где мы находимся:


$ cd Photos


Если вы не сидите где-то, где есть подкаталог Photos, то получите ошибочку:


bash: cd: Photos: No such file or directory


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


$ CDPATH=$HOME/Family/Memories
$ pwd
/etc
$ cd Photos
/home/smith/Family/Memories/Photos


Несколько каталогов можно указать через разделитель:


$ CDPATH=$HOME:$HOME/Projects:$HOME/Family/Memories:/usr/local


Итого: определяем переменную либо в локальном "~/.bashrc" либо в глобальном "/etc/profile" и перечисляем в ней самые популярные каталоги поиска.

Для меня это, допустим, каталог "Sources", в котором лежат исходники различных утилит:


$ echo $CDPATH
/home/xoadmin/Sources


$ pwd
/home/xoadmin/Music

$ cd picom
/home/xoadmin/Sources/picom


Если нужно быстро переключиться на другой проект, я не буду вводить полный путь до него и укажу только название.

LinuxCamp | #utils
🔥47👍3212
Разница между su и su -

Ни для кого не секрет, что Linux - система, с которой можно работать от разных пользователей. Сегодня я запускаю сессию от Паши, завтра от Пети.

Когда вы в сессии открываете терминал, стартует оболочка, которая подстраивает окружение под конкретного юзера: выполняет скрипты, определяет переменные.

Бывает, приходится, работая в сессии одного пользователя, переключиться на другого, например, чтобы использовать ресурсы, ограниченные правами доступа. Для этого мы используем команду "su" (substitute user), которая позволяет сменить пользователя в текущей оболочке:


$ su vasya


После того, как мы выполним команду, создастся дочерняя оболочка, которая переймет все переменные окружения родителя, определит пользовательские (USER, HOME ...) и выполнит локальные "Васины" скрипты: /home/vasya/.bashrc и т.д.:


$ export USER1VAR="vasya"

$ su xoadmin
$ printenv | grep USER
USER=xoadmin
USER1VAR=vasya


Чет какая-то каша выходит. Половина Васиных переменных, половина юзера xoadmin. Такой способ полезен, когда нам нужно быстро поменять пользователя и не требуется его окружение в изначальном виде.

Если нужно полностью воссоздать среду, как при чистом входе в систему, следует использовать "su -":


$ su - xoadmin


Окружение родителя мы не наследуем и запускаем оболочку типа "login shell", которая выполнит дополнительные скрипты инициализации "/etc/profile", "~/.bash_profile". Подробнее про типы оболочек говорили вот тут, а про этапы их инициализации тут.

Также, когда мы используем "su -", наш рабочий каталог переключается на домашний для целевого пользователя. Мелочь, но факт:


$ pwd
/home/vasya/Music
$ su - xoadmin
$ pwd
/home/xoadmin


LinuxCamp | #shell
👍78🔥15❤‍🔥85
Стрелка за 200 в работе с файловой системой

Представим такой рабочий процесс, когда нам нужно перемещаться между 4 каталогами, расположенными по совершенно разным путям.

Использовать "cd -" не вариант, т.к. оболочка запоминает только 1 прошлый каталог. Можно использовать CDPATH, но тогда нужно запоминать названия директорий, с которыми работаем.

Команды оболочки pushd, popd и dirs позволяют обойти это ограничение. Предположим, вы создаете локальный сайт и работаете с ресурсами:


/var/www/html
/etc/apache2
/etc/ssl/certs
~/Web/src


Быстро переключаться между ними можно с помощью функции оболочки - "стеком каталогов".

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

Просмотреть стек можно, используя команду dirs:


$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Web/src


Вывод команды можно напечатать столбцом "-p":


$ dirs -p
/etc/ssl/certs
/etc/apache2
...


А можно и пронумеровать "-v". Это нам позволит вдальнейшем удобнее переключаться между каталогами:


$ dirs -v
0 /etc/ssl/certs
1 /etc/apache2
...


Вы управляете стеком, выполняя две операции: pushing и popping (есть, кста, такой стиль танца - весело выглядит).

Pushing каталога добавляет его в начало списка (вершину стека) и переходит в него:


$ pushd /etc/apache2
/etc/apache2 /var/www/html


Для того, чтобы только добавить каталог в стек и не переходить на него, нужно использовать флаг "-n".

Popping удаляет верхний каталог из стека и возвращает нас на следующий за ним:


$ popd
/var/www/html


Если хотим полностью очистить стек, тогда либо выполняем "dirs -c", либо зовем popd до тех пор, пока не увидим:


$ popd
bash: popd: directory stack empty


Принцип работы со стеком заключается в том, что мы добавляем туда каталоги, после чего прыгаем по ним, используя аргументы для pushd и popd, которые рассмотрим далее.

LinuxCamp | #shell
👍39🔥17❤‍🔥3👎1
Практика использования: pushd, popd, dirs

И так, вернемся к задаче, над которой начали работать тут. Для того, чтобы быстро переключаться между 4 каталогами, нужно сначала добавить их в стек. Текущий будет самым левым (верхним):


$ pushd /var/www/html
/var/www/html ~/Web/src

$ pushd /etc/apache2
/etc/apache2 /var/www/html ~/Web/src

$ pushd /etc/ssl/certs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Web/src


Команда pushd без аргументов меняет местами два верхних каталога в стеке и переходит к новому верхнему. Давайте несколько раз переместимся между "/etc/ssl/certs" и "/etc/apache2":


$ pwd
/etc/ssl/certs

$ pushd
/etc/apache2 /etc/ssl/certs /var/www/html ~/Web/src

$ pushd
/etc/ssl/certs /etc/apache2 /var/www/html ~/Web/src


Что делать, если нужно перейти в другие каталоги стека, помимо двух верхних? pushd и popd принимают целочисленные аргументы для данной задачи. Давайте для наглядности выведем текущий стек в столбец:


$ dirs -v
0 /etc/ssl/certs
1 /etc/apache2
2 /var/www/html
3 ~/Web/src


Команда "pushd +N" сдвигает N каталогов с вершины стека в самый низ, а затем переходит к новому верхнему. Если нужно попасть в "/var/www/html" и сохранить структуру стека, используем:


$ pushd +2
/var/www/html ~/Web/src /etc/ssl/certs /etc/apache2


Отрицательный аргумент (-N) сдвигает каталоги в противоположном направлении. Чтобы перейти к каталогу в нижней части стека, можно либо сдвинуть все, кроме последнего, либо просто использовать "pushd -0":


$ dirs
/etc/apache2 /etc/ssl/certs ~/Web/src /var/www/html

$ pushd -0
/var/www/html /etc/apache2 /etc/ssl/certs ~/Web/src


Можно также удалять каталоги из стека, используя popd с аргументом. Команда "popd +N" удаляет каталог, расположенный на позиции N, из стека. Отрицательный аргумент (-N) означает отсчет снизу. Подсчет начинается с нуля, поэтому "popd +1" удаляет второй каталог сверху:


$ dirs
/var/www/html /etc/apache2 /etc/ssl/certs ~/Web/src

$ popd +1
/var/www/html /etc/ssl/certs ~/Web/src

$ popd +2
/var/www/html /etc/ssl/certs


Будьте аккуратны и внимательны. Если вы используете команду cd, то самый верхний элемент стека затрется на текущий активный каталог. Эту проблему мы научимся решать в пятницу)

LinuxCamp | #shell
🔥24👍165
Команда «ой, я забыл pushd»

Предыдущие посты по стеку каталогов: тут и тут.

Предположим, вы перемещаетесь между несколькими директориями с помощью pushd, а потом случайно запускаете cd и теряете первый элемент стека:


$ dirs
~/Web/src /var/www/html /etc/apache2

$ cd /etc/ssl/certs

$ dirs
/etc/ssl/certs /var/www/html /etc/apache2


Команда cd заменила каталог "~/Web/src" на "/etc/ssl/certs". Не волнуйтесь, чтобы все это дело пофиксить, нужно запустить pushd с дефисом:


$ pushd -
~/Web/src /etc/ssl/certs /var/www/html /etc/apache2


Команда работает практически аналогично "cd -": добавляет прошлый активный каталог в стек и переходит на него. Теперь к нам вернется потерянный каталог и сохранится тот, в который мы перешли через cd.

Если мы через cd куда-то перешли, осознали проблему, но менять каталог не хотим, используем pushd дважды. Для удобства еще и alias определим:


$ pushd -
~/Web/src /etc/ssl/certs

$ pushd
/etc/ssl/certs ~/Web/src


alias slurp='pushd - && pushd'


Такой прием, конечно, не поможет, если мы несколько раз через cd походили по разным местам. Тут нужно вовремя раздуплиться, иначе придется вводить полный путь.

LinuxCamp | #shell
🔥24👍15❤‍🔥31
Как менять пароли?

Для смены либо создания пароля в linux используется команда passwd. Если пользователь без root прав, то он сможет сменить только свой пароль. Если привилегирован, то сможет менять разным юзерам.

Смена собственного пароля:


$ passwd

Changing password for vitek
current password:
Enter new password:
Retype new password:


А теперь представим, что за нашей системой работает образный "Васек", который забыл свой пароль. Мы, будучи админом, можем создать для "Васька" новый пароль и пустить его в систему:


$ sudo passwd vasya

New password:
Retype new password:


Все, можем сообщить Васе пароль и пусть пользуется системой:


$ su - vasya
Password:
vasya@ubuntu-desktop:~$


А если мы, как админ, заметили, что у пользователя слабый пароль, то можем принудительно сделать его недействительным и заставить юзера обновить данные при следующей попытке входа. Для этого добавим флаг "-e":


$ sudo passwd -e vasya
$ sudo su - vasya

You are required to change your password immediately...
Changing password for vasya.
Current password:
New password:
Retype new password:


LinuxCamp | #microhelp
👍49🔥16🤯2💩2
Channel name was changed to «LinuxCamp | DevOps»
Как я познакомился с Димасом Dbus-ом

В общем-то, с dbus я уже был ранее знаком, но последние рабочие такски заставили меня прибегнуть к практике. Если кто не в танке, dbus (Desktop Bus) - это система межпроцессного взаимодействия в Linux. Позволяет она удобно из одного приложения дергать код другого, подписываться на сигналы и передавать информацию.

Задача была следующая - на стороне приложения отслеживать профили энергопотребления системы (balanced, powersave, performance) и корректировать поведение для экономии заряда либо выдавать сверх производительность.

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

1) tuned (com.redhat.tuned) - приложение, которым можно переключать и отслеживать профили. Можно использовать независимо от окружения;

2) PowerManagement (org.kde.Solid.PowerManagement) - kde модуль, который позволяет отслеживать состояние батареи: идет ли питание от провода, низкий ли заряд и т.д.;

По итогу, через PowerManagement получилось отследить 3 состояния: AC (питание по проводу), Battery и LowBattery. Если хотите проверить у себя:


$ qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement org.kde.Solid.PowerManagement.currentProfile


Полный интерфейс вывести можно вот так:


$ busctl --user introspect org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement


Приложение tuned позволило более гибко настроить приложуху и отследить профили (balanced, powersave, performance), которые могут выставляться независимо от заряда батареи. Узнать профиль:


dbus-send --system --dest=com.redhat.tuned --type=method_call --print-reply /Tuned com.redhat.tuned.control.active_profile


Вывести полный интерфейс:


$ busctl --system introspect com.redhat.tuned /Tuned


Конечно же для языка C у нас есть либа (libdbus), через которую аналогичную процедуру можно реализовать кодом. Задача еще в работе, поэтому по мере своего продвижения в dbus буду постить полезности.

LinuxCamp | #story
👍28🔥14❤‍🔥4🌚1🗿1
Утилиты для работы с DBus сервисами

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

1) qdbusviewer: графическая Qt утилита, которая позволяет просматривать активные сервисы в которые можно постучаться по системной (system bus) или пользовательской (session bus) шине. Она предоставляет удобный интерфейс для работы с объектами, методами и сигналами.


$ sudo apt install qttools5-dev-tools
$ qdbusviewer


2) dbus-send: низкоуровневый cmd инструмент, который позволяет вручную отправлять запросы к сервисам:


$ sudo apt install dbus
$ dbus-send --system --dest=com.redhat.tuned --type=method_call --print-reply /Tuned com.redhat.tuned.control.active_profile


Подписаться на сигнал через "dbus-send" не получится, для этого нужны утилиты, которые умеют прослушивать сервисы в реальном времени - "dbus-monitor".

3) dbus-monitor: выводит на консоль информацию о сигналах в момент их получения либо о методах в момент вызова:


$ dbus-monitor "type='method_call',interface='org.kde.Solid.PowerManagement'"


Входит в пакет dbus. Хорошо мне подходил для дебага. Я сначала пытался отследить сигнал - если приходит отбивка, значит сервис активен, интерфейс верный и можно переходить к коду.

4) busctl: современный аналог dbus-send, включен в systemd. С помощью утилиты можно вызывать (busctl call) методы и прослушивать (busctl monitor) события. Также можно выводить список узлов на пользовательской и системной шинах:


$ sudo apt install systemd

$ busctl call com.redhat.tuned /Tuned com.redhat.tuned.control active_profile

$ busctl --system monitor "com.redhat.tuned.control" "profile_changed"


$ busctl --user list
$ busctl --system list


LinuxCamp | #utils
👍26❤‍🔥84
Залутал гуся на cpp конфе 🐥
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥96😁14👍9❤‍🔥53
В смысле DevOps?

Друзья, вижу ваше негодование по поводу добавления DevOps к каналу) И прям читаю мысли: "Где тут вообще DevOps?!" Так вот, правки внесены не просто так.

К нам присоединяется редактор, который будет отвечать за данную тематику и дополнительно публиковать материалы по сетям.

Посты от редакторов будем маркировать тегом: by + имя (#bymaga).

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

Если нововведения приживутся, сделаем ультимативный канал, который будет захватывать несколько профилей.

LinuxCamp | #info
🔥51👍22❤‍🔥5💊21🍾1👨‍💻1
Полезные опции для поиска файлов через grep

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

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


$ grep -r "root" /etc/
/etc/mdadm/mdadm.conf:MAILADDR root
...


Если хотим подсветить вхождения цветом, используем опцию "--color=always":


$ grep --color=always -r "root" /etc/


Опции "-C, -B, -A" вообще имбовые, использую их целую неделю) Вы можете включить отображение не только текущей строки, в которой было найдено вхождение, но и n строк до/после:

1) -C: выводит n строк до и после вхождения;


$ grep -C2 -r --color=always "Hello3" ./
./hello-Hello1
./hello-Hello2
./hello:Hello3
./hello-Hello4
./hello-Hello5


2) -B: выводит n строк перед вхождением;


$ grep -B2 -r --color=always "Hello3" ./
./hello-Hello1
./hello-Hello2
./hello:Hello3


3) -A: выводит n строк после вхождения;


$ grep -A2 -r --color=always "Hello3" ./
./hello:Hello3
./hello-Hello4
./hello-Hello5


Если наш шаблон поиска походит на регулярное выражения, нужно использовать флаг "-F". Таким образом мы говорим команде искать ровно то, что мы запросили - без скрытых подтекстов.

Без флага мы получим строки, в которых присутствует хотя бы 1 символ из набора (H, e, l, o). С флагом получим строки с буквальным совпадением:


$ grep "[Hello]" hello
Help me please
Helloup
[Hello]


$ grep -F "[Hello]" hello
[Hello]


LinuxCamp | #utils
🔥38👍24❤‍🔥6
Как сделать службу недоступной?

Иногда возникает необходимость удалить службу Systemd или хотя бы сделать её недоступной для использования.

Сам юнит файл удалять нет смысла, потому что при следующем обновлении пакета он восстановится.

Самый простой способ избавиться от службы - это удалить пакет, вместе с котором она поставляется. Сначала нужно найти путь к файлу юнита. Это можно сделать с помощью команды "status":


$ systemctl status docker

docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)


Теперь узнаем имя пакета, с которым служба поставляется. Если мы работаем с deb сборками, используем флаг "-S":


$ dpkg -S /lib/systemd/system/docker.service
docker.io: /lib/systemd/system/docker.service


После того, как имя пакета известно, удаляем его:


$ sudo apt remove docker.io


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

Замаскированные службы нельзя запустить вручную и они не активируются на старте системы (даже если добавлены в автозагрузку). Для маскировки используется команда mask:


$ sudo systemctl mask docker
Created symlink /etc/systemd/system/docker.service → /dev/null


Прикольно, конечно, реализована маскировка - в системном каталоге для сервисов создается симлинка на устройство "/dev/null" (говорили о нем тут).

Если посмотрим на состояние службы, увидим, что она замаскирована:


$ sudo systemctl status docker
docker.service
Loaded: masked (Reason: Unit docker.service is masked.)


Для того, чтобы убрать маскировку используем команду unmask. Ссылка удалится и не будет мешать старту сервиса:


$ sudo systemctl unmask docker
Removed /etc/systemd/system/docker.service.


LinuxCamp | #systemd
🔥33👍256
Собираем минимальный Docker образ

Docker — это инструмент для запуска приложений в изолированных контейнерах. Он делает разработку и развертывание проще, быстрее и безопаснее.

Нужен он для: изоляции приложений и зависимостей, переносимости (софтина работает одинаково на любой системе) и DevOps-процессов.

Плюсы докера: простота развёртывания, экономия ресурсов по сравнению с виртуальными машинами, стандартизация окружения.

Минусы докера: не подходит для задач, требующих полной виртуализации, не оптимален для GUI-приложений, требует грамотной настройки безопасности.

Минимальный пример запуска первого Docker-контейнера с Python (FastAPI):

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


$ sudo apt install python3 python3-pip -y
$ sudo apt install docker.io -y


После установки создаем рабочую папку:


$ mkdir fastapi_backend && cd fastapi_backend


Активируем виртуальное окружение, чтобы изолировать зависимости проекта и с помощью команды pip freeze автоматически сформировать requirements.txt, не заполняя его вручную:


$ python3 -m venv venv
$ source venv/bin/activate


Cкачиваем необходимые для создания API зависимости с помощью пакетного менеджера pip и сохраняем их в requirements.txt:


$ pip install fastapi uvicorn
$ pip freeze > requirements.txt


2. Создадим в каталоге проекта файл "main.py" с простым API:


$ touch main.py


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "LinuxCamp"}


3. Ну и наконец добавим в локальный каталог сам Dockerfile - это инструкция по созданию docker контейнера. Cейчас приведу общий пример, в следующих постах подробнее разберем его структуру:


FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "127.0.0.1", "--port", "8000"]


4. На этом все! Мы уже можем собрать свой Docker-образ и запустить его, после чего приложение будет доступно по адресу ниже:


$ sudo docker build -t myapp .
$ sudo docker run -d -p 8000:8000 myapp


$ curl -L http://127.0.0.1:8000 
$ {"Hello":"LinuxCamp"}


http://127.0.0.1:8000


Также можно посмотреть наличие нашего docker контейнера в списке запущенных контейнеров с помощью команды docker ps:


$ docker ps

CONTAINER ID IMAGE COMMAND
640d6f4d1acb fastapi_backend "uvicorn main:app --…"


LinuxCamp | #devops #docker #bymaga
👍37🔥29❤‍🔥7🤔431
systemd: проверка статуса службы

Система инициализации Systemd позволяет не только запускать и останавливать службы, но и проверять их состояние.

Для просмотра информации о сервисе используется команда status утилиты systemctl. Например, чтобы посмотреть состояние docker нужно выполнить:


$ systemctl status docker

docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled;>
Active: active (running) since ...


Давайте рассмотрим полный вывод:

Loaded - означает что файл юнита загружен успешно и здесь же выводится путь к этому файлу.

Тут возможны и другие значения, например, masked если юнит скрыт или not-found если он не найден. Также здесь находится информация добавлен ли юнит в автозагрузку (enabled/disabled);

Active - текущее состояние и подсостояние юнита, если он запущен, выводится active(running), если он не был запущен, то inactive(dead) если что-то пошло не так, failed и т.д.

Docs - название man страницы с документацией для службы.

Process - запускаемые процессы, их состояние и код выхода.

Main PID - идентификатор основного процесса службы.

Tasks - количество процессов, запущенных в рамках этой службы.

Memory - потребление памяти службой.

CPU - использование процессора службой.

Для того чтобы посмотреть все доступные значения состояний для полей Loaded и Active выполните:


$ systemctl --state help


Списочек получите некороткий) За доп. инфой направлю вас в man.

После всех полей статуса выводится журнал службы - последние 10 строк вывода основного процесса.

Если хотите получить больше строк, используйте опцию "--lines" с нужным количеством:


$ systemctl status --lines=50 avahi-daemon


LinuxCamp | #systemd
👍50🔥10❤‍🔥64🗿2😭1
Где же сидят эти службы?

Прежде всего нужно упомянуть, что службы Systemd можно разделить на две категории:

1) системные службы, которые запускаются от суперпользователя. Для управления такими службами нужно использовать sudo.

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

Системные службы лежат в:

1) /usr/lib/systemd/system;
2) /lib/systemd/system;
3) /etc/systemd/system;

Пользовательские служы лежат в:

1) /usr/lib/systemd/user;
2) /lib/systemd/user;
3) /etc/systemd/user;
4) /home/user/.config/systemd/user;

Файлы сервисов, поставляемые с пакетами, как правило, располагаются в каталогах lib и /usr/lib, а в /etc/ расположены модифицированные юниты, переопределяющие стандартные настройки.

LinuxCamp | #systemd
👍44🔥2094😇2
Как узнать тип сессии: Wayland или Xorg?

Многие популярные дистрибутивы уже используют Wayland по умолчанию. Однако у Wayland всё ещё есть проблемы. Многие старые программы не поддерживаются или работают плохо.

Если у вас возникли какие-либо проблемы при работе с старыми программами, нужно проверить какой дисплейный сервер вы используете. Есть несколько способов сделать это.

Самый простой способ посмотреть какой дисплейный сервер используется в данный момент, это вывести содержимое переменной окружения XDG_SESSION_TYPE:


$ echo $XDG_SESSION_TYPE
wayland


Кроме того, можно узнать тип текущей сессии с помощью loginctl. Для этого нужно сначала вывести список активных сессий через list-sessions:


$ loginctl list-sessions

SESSION UID USER SEAT TTY
3 1000 parallels seat0 tty2
c1 127 gdm seat0 tty1

2 sessions listed.


Потом выводим тип конкретной сессии через опцию show-session:


$ loginctl show-session 3 -p Type
Type=wayland


Или можно сделать всё одной командой, получив идентификатор сессии из переменной окружения XDG_SESSION_ID (если определена):


$ loginctl show-session "$XDG_SESSION_ID" -p Type


LinuxCamp | #microhelp #sessions
👍34🔥13❤‍🔥4😁31
Если часто просматриваешь логи, помни про "tail -f"

Команда "tail -f" отображает последние строки файла и продолжает обновлять вывод в реальном времени. Это особенно полезно, когда работаешь с журналами, типа syslog. Утилиты head и tail рассматривали тут.

Много раз слышал от людей, что они для дебага какого-то функционала сначала инициировали вывод в syslog, после чего либо через GUI редактор, либо через постоянный вызов tail просматривали логи. Как-то неэффективно...

Для решения задач такого типа предлагаю использовать:


$ tail -f /var/log/syslog


Если нужно отображать больше последних строк, чем по дефолту, дописывайте флаг "-n". Когда дополнительно нужно прогнать вывод через фильтр, grep в помощь:


$ tail -n 100 -f /var/log/nginx/access.log


$ tail -f /var/log/nginx/error.log | grep "timeout"


Я помню, как сам мучился с дебагом, когда не был в курсе про этот чудо-флаг) Дело в том, что не все приложения выдают лог в консоль. Если вы работаете с демоном, то у него нет управляющего терминала и все идет в журналы. Как раз тут и было бы весьма удобно использовать "tail -f".

LinuxCamp | #microhelp #utils
👍50🔥144
Удаление файлов старше n дней

Пользователи иногда сталкиваются с ситуацией, когда нужно почистить определенный каталог, удалив из него старые файлы, которые давно не используются. Через стандартный GUI проводник это делать не всегда удобно. Через терминал - самое то)

Для CLI существует специальная команда find, которая отвечает за поиск файлов. Подробно говорили о ней тут.

С помощью опции "-mtime" получится найти только те файлы, дата изменения которых старше заданного временного промежутка. В качестве примера возьмем каталог Downloads и срок в 35 дней:


$ find ~/Downloads -type f -mtime +35


Следующий шаг – непосредственно чистка:


$ find ~/Downloads -type f -mtime +35 -delete


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


$ find ~/Downloads -name "*.zip" -type f -mtime +35 -delete


Также, чтобы сгоряча не удалить нужный и недавно используемый файл, можно для каждого элемента вывода выполнить "ls -l" и посмотреть дату последнего изменения ресурса:


$ find ~/Downloads -type f -mtime +5 -exec ls -l {} \;
... Feb 17 17:30 ./file


LinuxCamp | #microhelp #utils
🔥40👍30❤‍🔥43