Архив метки: linux

Предотвращение запуска второй копии процесса в cron с помощью утилиты flock

Столкнулся значит я со следующей задачей: необходимо чтобы скрипт всё время был запущенным, но вот досада — иногда он падает, причем каждый раз по каким-то новым необъяснимым причинам. Суть такова, что единичные падения совсем не критичны, главное чтобы 99% времени он был запущен. Для контроля, что скрипт запущен решено использовать cron. Но cron будет плодить бесконечное количество клонов скрипта каждую минуту, а нужен только один экземпляр.
Как же предотвратить дублирование процесса и быть уверенным, что запуск скрипта будет осуществлен только после падения предыдущего запуска? Беглый поиск показал, что с этим справится утилита flock, позволяющая блокировать запуск новых экземпляров скрипта.

Пример того, как выглядит запуск скрипта на python при использовании flock в задачах по расписанию cron:

* * * * * /usr/bin/flock -n /tmp/my.lockfile /usr/bin/python3 /path/to/script.py

при вызове надо будет указать файл блокировки, должен находится в директории с правами на запись. В некоторых руководствах советуют писать в папку /var/run но я с этим не заморачивался.

После завершений программы (или в моём случае при падении), блокировка, выставленная через файл my.lockfile, снимется и процедура может быть запущена вновь.
Параметр -n означает что flock сразу останавливает своё выполнение, если процесс блокирован.
Для Вашей настройки можете посмотреть также параметр -w (alias —wait —timeout) устанавливающий количество секунд ожидания разблокировки. Если за указанное время процесс не разблокируется, то попытка будет остановлена (exit code 1).

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

https://linux-notes.org/ustanovka-flock-v-unix-linux/

http://ru.manpages.org/flock/2

https://pingtool.org/ru/using-flock-to-ensure-only-one-instance-of-script-is-running/

-->

Как скопировать жесткий диск с OS linux

Бывает необходимо иметь резервную копию диска, на случай поломки или выхода из строя. Также возможна ситуация, когда Вы просто хотите перейти на диск большего размера. Как раз у меня возникла такая ситуация и на диск ssd диск 128 гигабайт перестал влезать необходимый софт. Для этого был прикуплен ssd на 250Gb. Установленная операционная система — Ubuntu 16.04 .
Немного порывшись в интернете решил, что самым простым способом будет исользовать специально предназначенную для этого программу clonezilla. Таким образом алгоритм перехода на новый диск будет таким

1. Копируем важную информацию на другой носитель/компьютер/облако. Думаю тут понятно что этот шаг обязателен, т.к. пойти может что-то не так и что никто никогда не предугадает )

2. Делаем образ clonezilla live. Для этого можно воспользоваться специальной утилитой tuxboot.
2.1 устанавливаем Tuxboot , на официальном сайте tuxboot написано как это сделать. Я выбрал
установку через ppa.
2.2 Запускаем просто набрав в командной строке tuxboot. Вас спросят пароль администратора.
2.3 Интерфейс будет достаточно понятным, выбираем образ и флешку, и далее ОК

3. Загружаемся с загрузочной флешки (В биосе надо нажать кнопку прерывания для выбора приоритета загрузки, на плате B350M PRO-VDH это F11)
3.1 Далее идут простые вопросы, выбираем с диска на диск и в самом простом случае выбираем все дефолтные настройки. Опять же особенности каждой опции можно узнать на официальном сайте clonezilla .

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

4*. Редактирование разбиения диска или партиций. Как было замечено, мне необходимо было перейти на диск большего объёма, бывают случаи что надо например сделать резервную копию на диск меньшего объёма. В таком случае в clonezilla надо выбрать режим «expert mode». И тогда в одном из окон вас спросят про разделы. Выбираем чтобы разделы создавались пропорционально.

Таким образом за 4 шага мне удалось перейти на новый, более быстрый и объёмистый диск на линуксе.

Джентельменский набор команд linux

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

Начнем с того, без чего просто нельзя:

pwd

Команда pwd покажет ваше текущее расположение

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

ls -la

Любителям FAR и total commander очень советую поставить аналог — midnight commander (mc). Установка будет выглядеть примерно так:

sudo apt-get install package
sudo yum install package

Команда установки пакета в зависимости от ОС линукс может меняться. Кстати после установки mc появится удобный редактор mcedit для редактирования файлов.

Найти все файлы с определенным разрешением

find -type f -name '*.php'

Команда для нахождения больших файлов в linux — размером более 100 мб.

find / -xdev -type f -size +100M

Часто бывает так, что логи (к примеру access.log и error.log) сильно разрастаются со временем и необходимо их очистить без удаления файла. Для этого поможет команда truncate

sudo truncate -s 0 test.txt

обнуляем файл, если прав хватает и без sudo то просто

> test.txt

При переходе

#делаем файл исполняемым
chmod a+x file.py

#где находится тот или иной пакет / программа
which php

uptime — позволяет посмотреть нагрузку на сервер. Подробнее http://habrahabr.ru/post/216827/

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

ps aux | grep manage.py[[:space:]]pdf_process | wc -l

Для работы с кроном, кстати есть прикольный сайт- crontab generator, где можно без лишних хлопот сгенерировать команды crontab . Для вызова редактора работы с кроном используйте команду crontab -e

crontab -e
# пример перезапуска apache2
sudo service apache2 restart

Проверить порт:
telnet some_host port, например telnet zabaykin.ru 80

Заархивировать по маске расширения файлов
tar -cvzf some_archive.tar.gz ./folder/*.jpg

Разархивировать tar.gz файл
tar -xvzf some_file.tar.gz

Команды идентификации:
Чтобы узнать под каким вы сейчас пользователем работаете — whoami
Чтобы узнать сетевое имя linux сервера, за которым сидите, команда — hostname