Суммирование столбца текстового файла

June 26th, 2008

Странное дело, посчитать сумму столбца в текстовом файле - тривиальная задача, и я был уверен что есть консольная утилита которая это делает. Но стал искать - не нашел, хотя всегда был уверен, что в Unix есть консольные утилиты на все случаи жизни. Может искал не так или не там, не знаю, тем не менее, сумму столбца посчитать было надо, набил вот эти несколько строчек, файл обозвал colsum:


#!/usr/bin/perl

while( <stdin> )
{
chomp;

$sum += $_;
}

print $sum . "\n";

Удобно применять в связке с awk. Для примера, посчитаем сколько RAM занял апач, т.е. суммируем столбец RSS:

ps uax|grep httpd| grep -v grep|awk ‘{print $6}’|colsum

Мониторинг значений UBC в OpenVZ

June 25th, 2008

Если вы не знаете что такое UBC (User Beancounters), то видимо это вам и не надо, но если интересно, читайте здесь: http://wiki.openvz.org/UBC. Ну а тем, кто знает, возможно пригодится скрипт для мониторинга UBC.

Алгоритм работы простой, парсим содержимое /proc/user_beancounters, смотрим значения failcnt, сравниваем с предыдущими, если значение увеличилось, выводим соответствующую строку.

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

Собственно сам скрипт: check_ubc.pl

Закрываем паролем папку на веб-сервере

June 15th, 2008

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

Для этой цели сделан скрипт, его достаточно закинуть по ftp в нужную папку, предварительно установив требуемые значения переменных $user и $password, выполнить и удалить. Обязательное условие - наличие прав на запись в выбранную директорию.

<?

$user = 'user';
$password = 'mypass';

$dir = getcwd();

if( ! is_writeable( $dir ) )
{
print 'directory is not writeable.';
exit;
}

$hta = $dir . '/.htaccess';
$htp = $dir . '/.htpasswd';

$fh = @fopen( $htp, 'a' );

if( ! $fh )
{
print '.htpasswd open error.';
exit ;
}

fwrite( $fh, $user . ':' . crypt( $password ) . "\n" );

fclose( $fh );

$fh = @fopen( $hta, 'a' );

if( ! $fh )
{
print '.htaccess open error.';
exit;
}

$s = "AuthType Basic\n" .
"AuthName Private\n" .
"AuthUserFile $htp\n" .
"Require valid-user\n";

fwrite( $fh, $s );

fclose( $fh );
?>

Если запись в папку нежелательна, то вот такой скрипт сгенерит содержимое файлов:


<pre>
<?
$user = '1';
$password = '1';

$dir = getcwd();

$htp = $dir . '/.htpasswd';

print "-- .htpasswd\n";
print $user . ':' . crypt( $password ) . "\n\n";

$s = "AuthType Basic\n" .
"AuthName Private\n" .
"AuthUserFile $htp\n" .
"Require valid-user\n";

print "-- .htaccess\n";
print $s;
?>
</pre>

Редактирование виртуального хоста в Plesk

June 7th, 2008

Конфиги виртуальных хостов Plesk генерирует сам и изменять не рекомендует. Но если необходимо внести какие-то свои изменения, возможность такая есть. Пусть для примера, конфиг для example.com находится здесь:

/var/www/vhosts/example.com/conf/httpd.include

Создаем рядом с ним vhost.conf:

/var/www/vhosts/example.com/conf/vhost.conf

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

/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=example.com

Проверяем конфигурацию апача, перезапускаем его.

apachectl configtest
apachectl restart

Аналогичным образом можно поступать с сабдоменами, например создаем:

/var/www/vhosts/example.com/subdomains/mysubdomain/conf/vhost.conf

Остальное все тоже самое.

Добавляем swap в Linux

June 3rd, 2008

Вообще-то сервак свопить не должен, иначе это уже не сервак, а хз что. Но бывает и не сервак, да и мало ли вдруг надо добавить свопа, всенепременно. Ну чтож добавим:

Создаем файл, в данном примере 2Gb:

# dd if=/dev/zero of=/swapfile bs=1024 count=2097152

Далее форматируем его:

# mkswap /swapfile

И добавляем:

# swapon /swapfile

После чего можем увидеть своп в списке /proc/swap. Обратная процедура также несложна:

# swapoff /swapfile

Блокируем повторный запуск php-скрипта из crontab

April 23rd, 2008

Нередко приходится встречатся с ситуацией когда скрипт, запускаемый из crontab-а не успевает отработать за положенное ему время, стартует еще одна его копия, а потом еще, еще и еще… Вовремя не заметить - может и сервер лечь.

Господам програмерам зачастую фиолетово на эти проблемы, так что приходится спасаться самому. Вот такой несложный код в начале php-скрипта, с использованием ф-ии flock не даст запустится второй копии:

$fh_lock = fopen( ‘/tmp/myscript.lock’, ‘w’ );

if( ! ( $fh_lock && flock( $fh_lock, LOCK_EX | LOCK_NB ) ) )
exit;

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

Работаем с clipboard из командной строки

March 25th, 2008

Работать с буфером обмена X Window из командной строки, как оказалось не просто, а очень просто, благодаря утилите xclip.

Например:

Ввод строки в буфер:

echo -n 'test' | xclip

Вывод строки из буфера:

xclip -o

Сайт проекта:
http://sourceforge.net/projects/xclip

RPM для Centos 5 можно взять здесь:
http://mirror.unl.edu/fedora/epel/5/i386/xclip-0.10-2.el5.i386.rpm

Используем LVM

March 23rd, 2008

Так как работать с LVM (Logical Volume Manager) приходится не часто, составил для себя небольшую шпаргалку, может и вам пригодится:

Cоздать физический том на диске hdb
pvcreate /dev/hdb

Удалить физический том
pvremove /dev/hdb

Проверим блочные устройства
lvmdiskscan

Покажет физические тома
pvdisplay

Ищет физические тома
pvscan

Создать группу томов
vgcreate -v vg1 /dev/hdb

Ищет группы томов
vgscan

Создать логический том размером 100Mb
lvcreate -L 100Mb  vg1 /dev/hdb

Ищет логические тома
lvscan

Покажет инфу о логическом томе
lvdisplay /dev/vg1/lvol0

Форматируем и монтируем логический том
mkfs.ext3 /dev/vg1/lvol0
mkdir /mnt/1
mount /dev/vg1/lvol0 /mnt/1

Удаляем логический том
lvremove /dev/vg1/lvol0

Используем fork в PHP

January 31st, 2008

Несложный пример использования ф-ии fork в скрипте на PHP. В данном случае, с помощью fork, поддерживаем одновременно работающими 5 процессов.


<?

function run_thread()
{
$pid = pcntl_fork();

if( $pid == -1 )
die( "fork error" );

if( ! $pid )
{
// child process

echo "run process\n";
do_work();

exit( 0 );
}
}

function do_work()
{
sleep( rand( 2, 5) );
echo "done\n";
}

$numproc = 5;

for( $i = 1; $i <= $numproc; $i++ )
run_thread();

while( 1 )
{
pcntl_wait( $status );

run_thread();
}

?>

Ставим OpenVPN

December 9th, 2007

Обычно с установкой проблем нет, так как во многих дистрибутивах openvpn cтавится “из коробки”.

Нет проблем с FreeBSD, openvpn есть в портах:

cd /usr/ports/security/openvpn
make install

В случае c CentOS мы можем сообщить yum-у о замечательном репозитории rpmforge (пример для CentOS 5, i386):

rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

далее тривиально:

yum install openvpn

Ну а если подходящих вариантов нет, то всегда можно поставить из исходников:

wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
wget http://www.oberhumer.com/opensource/lzo/download/LZO-v1/lzo-1.08.tar.gz
tar zxf lzo-1.08.tar.gz
cd lzo-1.08
./configure --enable-shared && make && make install
cd ..
tar zxf openvpn-2.0.9.tar.gz
cd openvpn-2.0.9
./configure --with-lzo-headers=/usr/local/include --with-lzo-libs=/usr/local/lib && make && make install