вторник, 1 сентября 2015 г.

tail -f on rapidly truncated file

При частой перезаписи файла (например, при ротации лог-файла) tail -f останавливается на первом таком событии. Для автоматического подключения к новому файлу следует использовать команду:
tail -f --follow=name --retry <filename>
В случае отсутствия функционала у бинарного tail (например, на busybox) можно использовать следующий bash-скрипт:
#!/bin/bash 

PID=`mktemp`
while true;
do
  [ -e "$1" ] && IO=`stat -c %i "$1"`
  [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; }

  # as long as the file exists and the inode number did not change
  while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]]
  do
     sleep 0.5
  done
  [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID
  sleep 0.5
done 2> /dev/null
rm -rf $PID

вторник, 7 июля 2015 г.

Перенос процесса в screen

Иногда возникает необходимость перенести важный долго работающий процесс из консоли без screen в screen для последующего закрытия консоли. Этого можно достичь с помощью утилиты reptyr (GitHub).
Установка в Debian/Ubuntu:
sudo apt-get install reptyr
Использование (в новой консоли):
screen -S <screen name>
reptyr <PID of running process to attach>

среда, 20 мая 2015 г.

Чем заняты inode в /

Сканирование всех директорий в / (без прохода по другим файловым системам) и вывод сортированного списка директорий от наименьшего количества занятых inode к наибольшему:
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

пятница, 13 марта 2015 г.

Правильная демонизация в perl

sub daemonize {
  logger('Entering Daemon mode');
  chdir '/' or die "Can't chdir to /: $!";
  umask 0;

  open STDIN,  '<', '/dev/null' or die "Can't read /dev/null: $!";
  open STDOUT, '>', '/dev/null' or die "Can't write to /dev/null: $!";
  open STDERR, '>', '/dev/null' or die "Can't write to /dev/null: $!";

  my $pid = fork;
  exit if $pid;
  if (!defined $pid) { die "Couldn't fork: $!" }
# Here you may want to detach script output from console
# logger_del('console'); #(*)
  setsid() or die "Can't start a new session: $!";

# logger('Now in Daemon mode'); #(*)
  say 'Now in Daemon mode';

  return
}

* 'logger()' is my own tool for convinient data output, you can simply replace it with 'say' or 'print'

четверг, 12 марта 2015 г.

среда, 11 марта 2015 г.

понедельник, 16 февраля 2015 г.

Windows 7 x64 + 1С выгрузка из MySQL

Для правильной работы надо установить ставить MySQL Connector/ODBC x86:
http://dev.mysql.com/downloads/connector/odbc/

При добавлении нового DSN через "Панель управления" - "Администрирование" - "Источники данных (ODBC)" 1С не может произвести выгрузку , т.к. "Источники данных (ODBC)" запускает x64 версию конфигуратора ODBC, а 1С - 32-битное приложение. Решить проблему можно в x86 версии конфигуратора ODBC, запустив:
%SystemRoot%\SysWOW64\odbcad32.exe

Детальнее можно почитать в FAQ:
http://dev.mysql.com/doc/connector-odbc/en/connector-odbc-errors.html

среда, 21 января 2015 г.

Инкрементация в bash

(( x++ )) или (( x += 1 )) или let x++

Создание раздела на большом диске

# parted /dev/<диск>
mklabel gpt
unit TB
mkpart primary 0 <кол-во терабайт диска>
print
quit

Горячая замена жестких дисков

При горячей замене жесткого диска, его следует сначала отмонтировать:
umount /dev/sdX

Затем записать все буферы из памяти на физические накопители:
sync

И удалить жесткий диск из списка устройств:
echo 1 >/sys/block/sdX/device/delete


Жесткий диск можно отключать.

После подключения нового диска, следует выполнить поиск новых устройств:
for i in $(ls /sys/class/scsi_host/); do echo "- - -" > /sys/class/scsi_host/$i/scan; done

SSH-тоннель

ssh -g -f -ND <IP сервера>:<порт SOCKS> <SSH логин>@<IP сервера> -p<порт SSHd>

Запуск tcpdump не из под root

groupadd tcpdump
addgroup <username> tcpdump
chown root.tcpdump /usr/sbin/tcpdump
chmod g+rx /usr/sbin/tcpdump
setcap "CAP_NET_RAW+eip" /usr/sbin/tcpdump