dmesg: вывод времени событий в читаемом виде

Иногда в dmesg содержится очень полезная информация, только вот незадача, совсем непонятно в какое время происходили данные события, в этом нам поможет команда (в некоторых случаях время может быть отображено некорректно):

wget http://nagg.ru/wp-content/uploads/2013/01/dmesg.pl
chmod +x dmesg.pl
./dmesg.pl

Сам скрипт ниже:

#!/usr/bin/perl

use strict;
use warnings;

my @dmesg_new = ();
my $dmesg = "/bin/dmesg";
my @dmesg_old = `$dmesg`;
my $now = time();
my $uptime = `cat /proc/uptime | cut -d"." -f1`;
my $t_now = $now - $uptime;

sub format_time {
 my @time = localtime $_[0];
 $time[4]+=1;    # Adjust Month
 $time[5]+=1900;    # Adjust Year
 return sprintf '%4i-%02i-%02i %02i:%02i:%02i', @time[reverse 0..5];
}

foreach my $line ( @dmesg_old )
{
 chomp( $line );
 if( $line =~ m/\[\s*(\d+)\.(\d+)\](.*)/i )
 {
 # now - uptime + sekunden
 my $t_time = format_time( $t_now + $1 );
 push( @dmesg_new , "[$t_time] $3" );
 }
}

print join( "\n", @dmesg_new );
print "\n";

Теперь вывод выглядит так:

[Mon Dec 17 16:37:51 2012] pci 0000:00:1f.2: reg 10: [io  0xf0b0-0xf0b7]
[Mon Dec 17 16:37:51 2012] pci 0000:00:1f.2: reg 14: [io  0xf0a0-0xf0a3]
[Mon Dec 17 16:37:51 2012] pci 0000:00:1f.2: reg 18: [io  0xf090-0xf097]
[Mon Dec 17 16:37:51 2012] pci 0000:00:1f.2: reg 1c: [io  0xf080-0xf083]

Вариант №2, менее надежный – не всегда корректно отображает время dmesg:

dmesg|perl -pE '/\[\s*(\d+\.\d+)\]/; $t=scalar localtime time-$1/100; s/\[\s*(\d+\.\d+)\]/[$t]/;'

Какие процессы используют больше всего памяти и CPU

Выведем список ТОП 15 самых прожорливых до памяти Linux сервера процессов следующей командой:

ps -eo user,pcpu,pmem,pid,cmd | sort -r -n -k3 | head -15

Сортировка процессов по потребляемой памяти, довольно наглядно:

ps -eo rss,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | egrep -v 0.00

Выведем список ТОП 10 процессов, которые более всего нагружают CPU:

ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10

Еще один вариант просмотреть самых требовательных до процессора сервисов (процессов):

ps -eo pcpu,pid,user,args | sort -r -k1 | less

Mysql: обновление timezone

Чтобы проверить текущую временную зону, нужно выполнить команду:

SHOW VARIABLES LIKE '%zone%';
SELECT @@global.time_zone, @@session.time_zone;

Чтобы посмотреть текущее время сервера MySQL:

select current_timestamp();

Прописать в конфигурационном файле timezone можно следующим способом (в таком случае потребуется перезагрузка):

/etc/my.cnf

default-time-zone = "Europe/Moscow"

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

mysql_tzinfo_to_sql /usr/share/zoneinfo |mysql -u root mysql -p

Далее, мы уже можем обновить временную зону без появления ошибок типа:

ERROR 1298 (HY000): Unknown or incorrect time zone:

Выполним обновление time_zone:

SET GLOBAL time_zone = 'Europe/Moscow';
SET time_zone = 'Europe/Moscow';

Sudoers: добавить права пользователю на запуск сервисов

Для подобного разрешения в ОС CentOS прописываем:

/etc/sudoers

apache  ALL=NOPASSWD: /etc/init.d/httpd

Пользователь может работать с init скриптом без запроса пароля:

$ sudo /etc/init.d/httpd stop
$ sudo /etc/init.d/httpd start

Более красивым решением видится include в sudoers и немного другой синтаксис, рассмотрим на примере доступа к init-скрипту redmine:

/etc/sudoers
…
#includedir /etc/sudoers.d

Добавляем в каталог /etc/sudoers.d файл redmine следующего содержания

redmine  ALL=(ALL) NOPASSWD: /etc/init.d/redmine

Теперь пользователь redmine может работать с init-скриптом:

$ sudo /etc/init.d/redmine
Usage: /etc/init.d/redmine <start|stop|restart|upgrade|force-stop|reopen-logs>

Как быстро создать файл большого размера в linux?

Есть 2 простых способа (их, конечно же, может быть больше, но смысла в этом уже нет) создать файл угодного вам размера в linux:

fallocate -l 40G /tmp/myfile.extension
truncate -s 10M /tmp/myfile.extension

Как узнать размер бд в mysql?

Бывает, когда требуется срочно узнать размер БД на сервере. В данном примере показано как это можно сделать имея доступ на сервер по SSH:

mysql -uLOGIN -p'PASSWORD' DATABASE -e "show table status\G" | egrep "(Index|Data)_length" | awk 'BEGIN { rsum = 0 } { rsum += $2 } END { print rsum }'

Подсчитать размер всех БД на сервере и вывести в МБ:

SELECT table_schema "DB Name",
Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB"
FROM   information_schema.tables
GROUP  BY table_schema;

Результат будет следующим:

[/bash]
+——————–+—————+
| DB Name | DB Size in MB |
+——————–+—————+
| nagg_ru | 139054.9 |
| information_schema | 0.0 |
| mysql | 5.5 |
| performance_schema | 0.0 |
| test_db | 0.0 |
+——————–+—————+
5 rows in set (5.17 sec)

Восстановление программного RAID в Linux

Состояние RAID можно увидеть командой:

cat /proc/mdstat

Personalities : [raid1] [raid10]
md0 : active raid10 sda1[4](F) sdd1[3] sdc1[2] sdb1[1]
      1459903488 blocks super 1.0 512K chunks 2 near-copies [4/3] [_UUU]

unused devices: <none>

В данном примере мы видим что диск /dev/sda1 помечен флагом «F» – FAILED.

Удаляем диск из RAID:

mdadm /dev/md0 --remove /dev/sda1

Сбрасываем Superblock:

mdadm --zero-superblock /dev/sda1

Добавляем обратно:

mdadm /dev/md0 --add /dev/sda1

OpenVZ: полезные команды на заметку

Добавить сетевой интерфейс сервера контейнеру, на примере eth1 (уточнение: это прямой проброс сетевой внутрь VE, на физическом сервере интерфейс eth1 не будет присутствовать после данной команды, ни в каком виде):

vzctl set <CTID> --netdev_add eth1 --save

Удалить сетевой интерфейс eth1 с контейнера

vzctl set <CTID> --netdev_del eth1 --save

Установка сервера AAA (FreeRadius)

В системах RedHat достаточно установить ААА-сервер из репозитария:

yum install freeradius freeradius-mysql

Запустить сервис и проверить что последний запущен успешно:

/etc/init.d/radiusd start
Запускается сервер RADIUS: Wed Mar 24 13:51:06 2010 : Info: Starting - reading configuration files ... [  OK  ]

Создать БД

mysql -u root

mysql> create database radius;

mysql> GRANT ALL ON radius.* TO radius@localhost IDENTIFIED BY "vjhtvbhf";

Загрузить дамп freeradius в созданную БД:

mysql -u radius -p'vjhtvbhf' radius < /usr/share/doc/freeradius-1.1.3/examples/mysql.sql

Прием факсов в системе FreePBX

Настроим в диалплане правила отправки факса на почтовый адрес:
/etc/asterisk/extensions_custom.conf

[fax-so]
exten => s,1,answer()
exten => s,n,Goto(in_fax,1)
exten => in_fax,1,StopPlayTones
exten => in_fax,n,Set(EMAILADDR=sf@nagg.ru)
exten => in_fax,n,Set(FAX_RX_FROM=fax@vester.ru)
exten => in_fax,n,Set(FAXFILE=/var/spool/hylafax/recvq/fax000000001.tif)
exten => in_fax,n,set(__call-from=${CALLERID(number)})
exten => in_fax,n,set(CALLERID(number)=${UNIQUEID})
exten => in_fax,n,Dial(IAX2/iaxmodem/${UNIQUEID})
exten => in_fax,n,wait(5)
exten => in_fax,n,Hangup
exten => h,1,system(/usr/bin/mutt -s "New Fax message from id:${URIENCODE(${CALLERID(number)})} ${URIENCODE(${CALLERID(name)})}" -a ${FAXFILE} ${EMAILADDR} < /dev/null)
exten => h,n,system(/var/lib/asterisk/bin/fax-clear.sh)

Содержание скрипта /var/lib/asterisk/bin/fax-clear.sh

#!/bin/bash
# Выборка первой строки из файла seqf ######################
#NCOUNT="awk 'NR==1 {print $1}' /var/spool/hylafax/recvq/seqf"
#
rm -f /var/spool/hylafax/recvq/*.tif
echo '0' > /var/spool/hylafax/recvq/seqf

Создаем во FreePBX собственный маршрут назначения в описанный диалплан: