запускать задачу раз в месяц в субботу

Часто необходимо запускать что-то (например полный бекап бд) раз в месяц, но в выходной, допустим в ночь с субботы на воскресенье.

Это можно сделать в crontab следующим образом

0 23 * * 6 [`date "+%d"` -lt 8] && /path/to/script

Это запустит скрипт в первую субботу месяца в 23:00.

Monit: простое средство мониторинга

Monit - достаточно простое, но одновременно удобное, достаточно мощное и надежное средства для мониторинга ваших серверов.
Monit умеет мониторить:
  • процессы (наличие, количество потребляемых ресурсов)
  • файлы, директории и файловые системы на изменения (дата создания/изменения, изменения размера и контрольной суммы)
  • сетевые хосты (пинг и коннект на определенный порт по определенному протоколу)
При возникновении проблемы monit отправляет e-mail (шаблоны можно модифицировать) и может перезапустить сервис.
В monit встроен простенький веб-сервер, который позволяет посмотреть состояние объектов мониторинга, включить/выключить определенный объект.
Monit умеет перезапускать сервисы если они падают или не выполняется какое-то условие.

Monit построен с идеей того что система мониторинга должна быть максимально надежной и простой. И это действительно выполняется: на monit можно положиться.



Конечно из-за своей простоты monit не обладает тем количеством возможностей, которыми обладают Enterptise-системы мониторинга. Однако существует дополнение к monit под названием M/Monit, которое позволяет управлять несколькими серверами с monit из одного места. К сожалению, M/Monit распространяется под коммерческой лицензией и за деньги.

Посмотрим что он умеет:

Установка проста:

emerge -av monit

После этого вам необходимо отредактировать файл /etc/monitrc. Он достаточно хорошо документирован и там много примеров, вот еще несколько:

/etc/monitrc
set daemon  120 # проверять объекты каждые 2 минуты
set logfile syslog facility log_daemon

set mailserver localhost # тут для большей надежности можно указать несколько smtp-серверов
set eventqueue # задаем очередь сообщений - чтобы monit мог отправить алерт позже, если в данный момент почтовый сервер не доступен
basedir /var/monit
slots 10
set mail-format { from: monit@ myserver.com }
set alert admin1 admin2 # список получателей алертов

# конфигурация встроенного http сервера
set httpd port 2812 and
use address 0.0.0.0
allow 1.2.3.4
allow admin:password

include /etc/monit.d/*

/etc/monit.d/system
# проверка общих ресурсов сервера
check system myserver
if loadavg (1min) > 30 then alert
if loadavg (5min) > 20 then alert
if memory usage > 75% then alert
if cpu usage (user) > 70% then alert

# проверка apache2:
check process apache with pidfile /var/run/apache2.pid
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if totalmem > 500.0 MB for 5 cycles then restart
if children > 250 then restart
if loadavg(5min) greater than 30 for 8 cycles then stop
if failed host myserver.com port 80 protocol http
and request "/index.html"
then restart
if failed port 443 type tcpssl protocol http
with timeout 15 seconds
then restart
if 3 restarts within 5 cycles then timeout


# проверка свободного места на фс
check device data with path /dev/sdb1
start program = "/bin/mount /data"
stop program = "/bin/umount /data"
if space usage > 80% for 5 times within 15 cycles then alert
if inode usage > 80% then alert
group server

Ссылки:

Настройка OpenVPN, VPN через http (https) прокси

В некоторых сетях единственным доступным сервисом является веб через прокси-сервер. Многие сервисы (ssh, почта, некоторые IM) не могут работать через прокси, но существуют способы пробросить vpn на какой-либо удаленных хост.

Итак, после проведения некоторого исследования, выбор пал на openvpn. И вот как я его настраивал:



1: установка OpenVPN


У меня было две машины: мой ноутбук (note) и домашний сервер vpn.mydomain.ru (который выполняет у меня функции интернет-шлюза, кешрующего прокси, тестового веб-сервера, файлохранилища, и многого чего другого).

Установка и на том и на другом прошла очень легко (строго говоря, он у меня уже был установлен "на всякий случай"):
emerge -av1 openvpn
Отмечу полезный USE-флаг: examples. Он включает установку примеров конфигурационных файлов, которыми можно воспользоваться как основой для написания своих.

2: конфигурация сервера


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

cd /usr/share/openvpn/easy-rsa/

# инициализация
. ./vars
./clean-all

# эта команда создает Certificate Authority, выполняется интерактивно (т.е. вам нужно будет
#ответить на несколько вопросов). Можно оставить все по умолчанию, изменив лишь данные о
#географическом положении.
# Единственный вопрос, на который следует обратить внимание - Common Name. Не так важно, что вы
#туда введте, но он должен быть установлен.
./build-ca

# генерация пары ключей для сервера
./build-key-server server

# генерация пары ключей для клиента
./build-key note

# генерация Diffie Hellman:
./build-dh

После этого в поддиректории keys появятся все необходимые ключи.
Переместите их в какое-нибудь надежное и защищеное место.
Скопируйте файлы ca.crt и note.* на клиент.

Строго говоря, можно было сгенерировать пару ключей на клиенте и передать на сервер публичный ключ для подписи. Но поскольку у меня был защищеный канал (ssh) между клиентом и сервером, я сгенерировал все в одном месте.

Далее нужно написать конфигурационный файл для openvpn. У меня получилось так:
# биндимся к порту 443, т.к. это единственный порт, на который разрешено делать CONNECT на том прокси-сервере
#port 1194
port 443

# TCP or UDP server?
proto tcp
;proto udp

dev tun

# пути к файлам сертификатов
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem

# тут важно выбрать такую подсеть, которая не пересекалась бы ни с одной другой используемой вами
server 192.168.120.0 255.255.255.0

ifconfig-pool-persist ipp.txt

# так можно указывать клиенту, какие сети нужно маршритизировать через этот vpn
;push "route 192.168.1.0 255.255.255.0"

# а так можно указать, что этот vpn следует сделать шлюзом по умолчанию (что нам и нужно)
push "redirect-gateway"



# Разрешаем клентам взаимодействовать друг с другом, по умолчанию отключено
client-to-client

# The keepalive directive causes ping-like
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120

# включаем компрессию
comp-lzo

# так можно указать максимально количество клиентов
;max-clients 100

# так можно заставить openvpn сбросить права
;user nobody
;group nobody

# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun

# лог-фай
status openvpn-status.log

Запуск сервера происходит командой openvpn /etc/openvpn/server.conf.
Перед запуском надо подгрузить модуль tun.

3: Конфигурация клиента


Вот конфигурационный файл:
client

dev tun

# указываем протокол и прокси
proto tcp
http-proxy proxy 3128
;http-proxy-retry # retry on connection failures

# указываем адрес и порт удаленного сервера
remote vpn.mydomain.ru 443

resolv-retry infinite
nobind

# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nobody

persist-key
persist-tun

# пути к сертификатам и ключам
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/note.crt
key /etc/openvpn/keys/note.key

# разрешаем компрессию
comp-lzo

После подгрузки модуля tun и запуска клиента, можно убедиться что интерфейс поднимается, и сервер пингуется.
Внимание: после поднятия vpn, openvpn перепишет шлюз по умолчнию, так что нужно заранее добавить статические маршруты (если таковых нету) к прокси-серверу и местной локальным ресурсам.

Однако после поднятия vpn, внешние ресурсы все еще не будут работать. А все потому что нужно выполнить шаг

4: настройка NAT


Во-первых, разрешаем серверу маршрутизировать пакеты. Для этого пишем в /etc/sysctl следующее:
net.ipv4.ip_forward = 1
net.ipv4.ip_dynaddr = 1
После чего выполняем sysctl -a.

Далее нужно средствами iptables настроить правила маскарадинга. Для этого удобно написать sh-скриптик, который в дальнейшем будет удобно пополнять и редактировать. У меня он имеет примерно такой вид (сокращено):
#!/bin/sh

# маски используемых сетей
IP_LAN="192.168.1.1/24" # моя домашняя сеть
IP_PROVIDER="10.0.0.1/8" # локальная сеть провайдера

# интерфейсы
IF_EXT="eth1" # сюда подключен Ethernet от провайдера
IF_LAN="eth0" # сюда подключена локальная сеть
IF_INET="ppp0" # сюда "подключен" интернет
IF_VPN="tun0" # это интерфейс нашего vpn

IPT="iptables"

# cleaning:
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
$IPT -X

# тут по желанию и степени паранои
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT

# allow loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

###
# local host:

# allow outgoing connections:
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# разрешаем подключения к vpn
$IPT -A INPUT -p tcp --dport 443 -j ACCEPT

# разрешаем NAT из локальной сети и VPN:
$IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $IF_INET -j MASQUERADE

$IPT -A FORWARD -i $IF_LAN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_LAN -o $IF_INET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_INET -o $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPT -A FORWARD -i $IF_VPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_VPN -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_VPN -o $IF_INET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_INET -o $IF_VPN -m state --state ESTABLISHED,RELATED -j ACCEPT

После выполнения скрипта достаточно сделать /etc/init.d/iptables save и добавить iptables в runlevel: rc-update add iptables default

Как заставить пользователя сменить пароль при следующем логине

  1. Сначала, заблокируйте аккаунт для того, чтобы предотвратить его использование, пока не будут внесены изменения.
    usermod -L username
  2. Измените дату окончания действия пароля в 0, для того чтобы заставить пользователя сменить его при следующем логине: chage -d 0 username
  3. Разблокируйте аккаунт. usermod -U username
Оригинал: RH Magazine

Трюки bash

История и bang-bang


История команд - очень удобный инструмент. С помощью стрелок вверх-вниз можно перемещаться по истории введенных команд. Кроме того, с помощью команды history можно просмотреть всю историю команд:

190  ps axu | grep htt
191 /www/bin/apachectl start
192 vi /usr/local/lib/php.ini
193 cat /www/logs/error_log
194 ps -auxw | grep http
195 pwd

Ничего удивительного.
Гораздо интереснее то, что называется bang-bang, или команда !!. `!!` означает последнюю команду в истории. Т.е. ввод !! в данном случае аналогичен pwd.
Но и это еще не все. Можно ввести `!<первые буквы команды>`. `!ps` вызовет `ps axu | grep htt`. Но будьте внимательны и сообщайте восклицательному знаку достаточно символов команды. Например !p в данном случае будет аналогично `pwd`, а не `ps axu | grep htt` (поскольку pwd ниже в истории) как возможно хотелось бы.



:p не просто смайлик


Для того чтобы избежать конфузов при использовании ! можно добавлять к нему смайлик :p. Это заставит bash вывести то, что он собирался выполнить. Кроме того, :p достаточно умен для того, чтобы добавить выведенную команду в историю.

В качестве примера:
!ps:p в нашем случае вернет "ps axu | grep htt". Убедившись что это именно то что нужно, можно ввести !! и bash выполнит `ps axu | grep htt`.

Другие способы использования истории


Наверное самый примитивный способ - вызвать команду history, узнав номер необходимой команды, а затем использовать !N, где N - номер команды в истории (например, !192). Не следует пренебрегать этой возможностью. Иногда запомнить !123 для какой-то постоянно нужной команды гораздо проще чем пользоваться другими способами.
Кстати, :p работает и тут.

Еще один удобный способ - нажать ^r (Ctrl-r) и начать вводить первые символы нужной команды. bash будет искать в истории подходящие команды.

Работа с аргументами


!$ (bang-dollar) означает последний аргумент последней команды.
К примеру тут:
ls /some/long/path/to/dir/
rm -rf !$
!$ превратится в /some/long/path/to/dir/.

Кстати, :p тут тоже работает.

!* похожа на !$. !* превращается во все аргументы последней команды.

Шапочки


Наверняка вы не раз вводили что-то типа
vi /etc/X22/xorg.conf
Это очень легко поправить с помощью шляпок:
^22^11 заменяет 22 на 11 в предыдущей команде. По аналогии всегда можно использовать ^ошибка^исправление.

Автодополнение


Ну и разумеется не стоит забывать про автодополнение. Один Tab дополняет команду насколько можно понять, второй выводит все варианты дальнейшего написания. Однако не следует этим злоупотреблять. Согласитесь, написать less быстрее, чем написать le и долбить по табу.

Алиасы


Полезно дать короткие имена часто используемым командам. Также полезно дать алиасы наиболее частым опечаткам.
Полезными алиасами могут быть:
alias ls='ls --color=auto'
alias mroe='more'
alias H='kill -HUP'
alias ssh-production='ssh www.myproject.com'
alias ssh-qa='ssh qa.myproject.com'
alias sl='ls'

© Deadman.org

Забудьте man crontab


По какой-то причине администраторы (и я не исключение) постоянно забывают порядок полей в crontab'е и постоянно возвращаются к его мануалу.
Чтобы не терять времени, добавте следующий комментарий в начало вашего crontab:


#minute (0-59),
#|      hour (0-23),
#|      |       day of the month (1-31),
#|      |       |       month of the year (1-12),
#|      |       |       |       day of the week (0-6 with 0=Sunday).
#|      |       |       |       |       commands
0       2       *       *       0,4     /root/bin/logchecker

&copy; Unix Guru Universe: Unix Tip 2588 - February  2, 2007
http://www.ugu.com/sui/ugu/show?tip.today