вторник, 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'

понедельник, 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