Skip to content


Автоматическое создание скриншотов в Linux

Как-то посетила меня мысль, что было бы неплохо где-то хранить историю открытых терминалов, чтобы в случае неожиданной перезагрузки рабочего компа вспомнить на каких же именно серверах я сидел SSH-ем и при необходимости доделать начатое. Непродолжительное гугление вкупе с "yum search screenshot" вывело меня на 2 следующих программки: shutter и scrot. Обе нашлись в стандартных репозиториях Fedora. Первая за собой потянула кучу Perl-модулей и не сильно мне понравилась тем, что, во-первых, отрабатывает довольно долго (секунды 3-4), а во-вторых, не умеет работать молча (на экране хоть и ненадолго, но появляется раздражающее окошко). Вызывал я её из крона следующим образом:

1 * * * * DISPLAY=:0 /usr/bin/shutter -f --disable_systray --min_at_startup -e > /dev/null 2>&1

Параметр -e означает, что нужно сразу завершить работу без лишних вопросов, а -f означает, что нужно сделать скриншот всего экрана целиком. Если нужно заскриншотить только определённую область экрана, то вызывать нужно так:

/usr/bin/shutter --select=100,100,300,300

Первые два числа - координаты (X,Y) верхнего левого угла прямоугольной области, вторые два числа - размеры области в пикселях по горизонтали и вертикали соответственно. При наличии ключика --select результат своей работы сохраняет в домашний каталог в виде файлов c именами "Выделение_001.png", "Выделение_002.png" и т.д. или, если установлена английская локаль, то "Selection_001.png", "Selection_002.png" и т.д. При наличии ключика -f имена файлов будут такие: "Рабочий стол 1_001.png", "Рабочий стол 2_001.png" и т.д.

Вторая софтинка (scrot) работает заметно быстрее и молча (что и определило мой выбор в её пользу). На её основе был написан следующий скриптец:

#!/bin/bash
 
WD=/home/sysadmin/screens
export DISPLAY=:0
[ ! -d $WD ] && mkdir -p $WD
/usr/bin/scrot $WD/sc-$(date '+%Y-%m-%d_%H:%M').png >> /tmp/scrot.log 2>&1
 
if [ `date '+%H'` -eq 19 ]; then
  # removing old screenshots
  cd /tmp
  find $WD -mtime +30 | xargs -r rm
fi

В результате в каталоге /home/sysadmin/screens будут создаваться файлы с именами, соответствующими текущей дате и времени. Скриптец был повешен в крон выполняться раз в час. Блок if задуман для того, чтобы раз в сутки находить и удалять скриншоты старше 30 дней от роду. Scrot, в отличие от shutter-а, не умеет выцеплять область экрана, а только может сохранять весь экран целиком.

Если кто знает способ делать скриншот только определённого рабочего стола, а не текущего, прошу отписаться в комментариях. Просто у меня в KDE рабочих столов 6 штук, и терминалы с SSH-ем группируются обычно только на одном из них.

Posted in *nix, Howto.

Tagged with .


Просмотр изменений в пакетах через yum

Часто бывает интересно при установке обновлений что же именно было изменено в устанавливаемом пакете (иногда такое знание даже помогает принять правильное решение о целесообразности установки нового пакета вообще). Можно, конечно, скачать rpm-файл, распаковать, найти файл CHANGELOG, почитать... Но удобнее воспользоваться плагином к yum-у, который так и называется: yum-changelog. Устанаваливаем:

# yum install yum-changelog
Подготовка к установке
Разрешение зависимостей
--> Проверка сценария
---> Пакет yum-plugin-changelog.noarch 0:1.1.28-1.fc14 помечен для установки
--> Обработка зависимостей: python-dateutil для пакета: yum-plugin-changelog-1.1.28-1.fc14.noarch
--> Проверка сценария
---> Пакет python-dateutil.noarch 0:1.5-3.fc14 помечен для установки
--> Проверка зависимостей окончена
.....

Пользуемся:

$ yum changelog 2011-09 tzdata
Загружены модули: changelog, langpacks, presto, refresh-packagekit
Adding ru_RU to language list
Listing changelogs since 2011-09-14
==================== Available Packages ====================
tzdata-2011k-0.1.20110921.fc14.noarch    updates
* Wed Sep 21 15:00:00 2011 Petr Machata <pmachata@redhat.com> - 2011k-0.1.20110921
- Upstream 2011j:
  - Fix the Samoa date line skip
  - Changes in past timestamp typos several Africa zones
- Proposed upstream 2011k:
  - Belarus and Ukraine adopt permanent DST in 2011
  - Palestine suspends DST during Ramadan in 2011
  - Gaza and West Bank split in 2011.  West Bank is tracked in the
    timezone Asia/Hebron.  zone.tab update accordingly.
- Resolves: #737896
changelog stats. 2 pkgs, 2 source pkgs, 1 changelog

В данном случае команда вывела изменения, которые были внесены в пакет tzdata с сентября 2011 по текущий момент.

Можно также просто вывести заданное количество последних изменений, без указания даты. Например, следующая команда покажет 2 последних изменения в пакете tzdata:

$ yum changelog 2 tzdata
Загружены модули: changelog, langpacks, presto, refresh-packagekit
Adding ru_RU to language list
Listing 2 changelogs
==================== Installed Packages ====================
tzdata-2011k-0.1.20110921.fc14.noarch    installed
* Wed Sep 21 15:00:00 2011 Petr Machata <pmachata@redhat.com> - 2011k-0.1.20110921
- Upstream 2011j:
  - Fix the Samoa date line skip
  - Changes in past timestamp typos several Africa zones
- Proposed upstream 2011k:
  - Belarus and Ukraine adopt permanent DST in 2011
  - Palestine suspends DST during Ramadan in 2011
  - Gaza and West Bank split in 2011.  West Bank is tracked in the
    timezone Asia/Hebron.  zone.tab update accordingly.
- Resolves: #737896
 
* Mon Aug 29 15:00:00 2011 Petr Machata <pmachata@redhat.com> - 2011h-1
- Upstream 2011i:
  - Add Africa/Juba (South Sudan) zone
  - Samoa skips over the date line on 2011-12-30
  - Use KALT as abbreviation for Europe/Kalinigrad
  - Canonical version of the Newfoundland patch
  - Change America/Resolute use of EST to 2006-2007 only
  - Assume Metlakatla abandoned use of daylight saving in 1983
  - Sync iso3166.tab and zone.tab with above
- Resolved: #734063
 
changelog stats. 1 pkg, 1 source pkg, 2 changelogs

Альтернативный метод смотреть историю изменений пакета:

$ rpm -q --changelog skype
* Tue Feb 05 2008 Skype Technologies S.A. <info@skype.net> 2.1.0.10
- bugfix: #98304, Groups: No menus without surprise key.
 - bugfix: #98312, Debug logs have different Filenames.
 - bugfix: fix for tabs issue with qt 4.4.0 forward ported from 2.0.
 - internal: disable prelink for skype on fc9 and fc10.
 - internal: lib update

А вот так можно посмотреть список зависимостей пакета:

$ rpm -qR skype
/bin/sh
/bin/sh
alsa-plugins-pulseaudio(x86-32)
config(skype) = 4.3.0.37-fc16
libQtCore.so.4
libQtDBus.so.4
libQtGui.so.4
libQtNetwork.so.4
libQtWebKit.so.4
libQtXml.so.4
libX11.so.6
libXScrnSaver
libXext.so.6
libXss.so.1
libXv
libXv.so.1
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libc.so.6(GLIBC_2.3.2)
libc.so.6(GLIBC_2.3.4)
libc.so.6(GLIBC_2.4)
libc.so.6(GLIBC_2.7)
libdl.so.2
libdl.so.2(GLIBC_2.0)
libdl.so.2(GLIBC_2.1)
libgcc_s.so.1
libgcc_s.so.1(GCC_3.0)
libgcc_s.so.1(GLIBC_2.0)
libm.so.6
libm.so.6(GLIBC_2.0)
libm.so.6(GLIBC_2.1)
libpng
libpthread.so.0
libpthread.so.0(GLIBC_2.0)
libpthread.so.0(GLIBC_2.1)
libpthread.so.0(GLIBC_2.2)
libpthread.so.0(GLIBC_2.3.2)
librt.so.1
librt.so.1(GLIBC_2.2)
libstdc++.so.6
libstdc++.so.6(CXXABI_1.3)
libstdc++.so.6(GLIBCXX_3.4)
libstdc++.so.6(GLIBCXX_3.4.9)
pulseaudio-libs
qt >= 4.6
qtwebkit
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)

Posted in *nix, Howto.

Tagged with , , .


Определение размера страницы памяти

Страница памяти (Memory page) - это диапазон последовательно идущих адресов в пространстве виртуальной памяти. Размер страницы всегда является степенью числа 2. Эти виртуальные адреса транслируются в соответствующий диапазон физических адресов. Размер страницы памяти является архитектурно-зависимым.
В архитектурах x86 и x86_64 размер страницы памяти равен 4КБ, у Intel Itanium (IA64) - 16КБ. Определить размер страницы на кокретной машине под ОС Unix можно с помощью системного вызова getpagesize. Вот пример программы на языке C, которая возвращает размер страницы памяти в байтах:

#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char* argv[])
{
        long mempagesize = sysconf(_SC_PAGESIZE);
        printf("memory pagesize on this box : %i\n", mempagesize);
        return 0;
}

Компилировать, например, так:

gcc -o getpagesize getpagesize.c

Posted in *nix.

Tagged with , .


Толкование и лечение ошибок ядра из dmesg в Linux

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

Текст сообщения: TCP: time wait bucket table overflow
Лечение (способ N1): Увеличить параметр /proc/sys/net/ipv4/tcp_max_tw_buckets
Лечение (способ N2): Уменьшить тайм-аут для состояния TIME_WAIT TCP-соединений.

Текст сообщения: Neighbour table overflow
Лечение:

echo 256 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 1024 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

Posted in *nix, Howto.