BG, FG, %, &, JOBS, CTRL+Z, DISOWN

Запуск процесса в фоновом режиме
Амперсанд & после команды запустит ее в фоновом режиме.

cp -pR /home/ /mnt/bacup/ &

С работающей командой тоже самое можно сделать так: нажать CTRL+Z

:~$ cp -pR /home/ /mnt/backup/
^Z
[1]+  Stopped                 cp -pR /home/ /mnt/backup/
:~$ ps ax | grep cp | grep -v grep
4833  2.9  0.0  14184   872 pts/0    T    11:40   0:01 cp -pR /home/ /mnt/backup/

Как видим процесс находится в STAT T
Набираем bg для того, чтобы запустить команду в фоне

:~$ bg
[1]+ cp -pR /home/ /mnt/backup/ &
:~$ ps ax | grep cp | grep -v grep
 4833 pts/0    R      0:01 cp -pR /home/ /mnt/backup/
:~$

Процесс перешел в STAT R и выполняется в фоне, фоновый процесс называется job (задание)
Посмотреть список заданий можно командой jobs

:~$ jobs
[1]   Stopped                 cp -pR /home/ /mnt/sdb/
[2]   Stopped                 vim 1.txt
[3]-  Stopped                 vim 2.txt
[4]+  Stopped                 vim 3.txt
  • + — текущая задача.
  • — последняя задача
  • К остальным задачам можно обратиться по их идентификационному номеру.

Запустить задачу в foreground

  • Команда fg без параметров или fg + запустит текущую задачу (со знаком +) в foreground
  • fg +
  • Команда fg — запустит последнюю задачу (задача со знаком )
  • fg -
  • Запустить задачу можно по их идентификационному номеру
    fg 2
    fg %2
  • Вместо fg можно использовать просто знак процента %
    %+
    %-
    %2

Команда disown используется для отделения задачи от таблицы задач текущего shell. При отделении задачи от текущего shell, ее родителем становится INIT. После это можно завершить текущий shell, команда продолжит выполняться. На самом деле, если отправить команду в background, а потом завершить сессию, произойдет тоже самое, т.е. родителем станет INIT

:~$ disown %2
:~$ ps -fe | grep cp | grep -v grep
s0x90      5346     1  6 12:56 ?        00:15:24 cp -pR /home/ /mnt/backup/
:~$ yes > /dev/null &
[1] 6576
:~$ ps -f | grep yes | grep -v grep
s0x90      6576  6144 96 17:26 pts/0    00:00:10 yes
:~$ logout
:~$ ps -fe | grep yes | grep -v grep
s0x90      6576     1 91 17:26 ?        00:01:15 yes

Не забывайте про чудесную утилиту-мультиплексор screen

logrotate зависает в STAT D

По неизвестной причине logrotate перестал удалять старые архивы журналов, в результате образовалась директория размером в 160M и logrotate просто зависал в STAT D (ожидание системы ввода/вывода), отъедая весь процессор и большую часть оперативной памяти.
Удалил директорию через rm -r, удалялось часа 4.
logrotate продолжал виснуть, но теперь уже в STAT R, спотыкаясь на ротации btmp. Помогла очистка/var/lib/logrotate/status

rm /var/lib/logrotate/status && touch /var/lib/logrotate/status

Причина такого поведения, к сожалению, так и неизвестна, конфиги в /etc/logrotate.d/ верные.

Sysstat мониторинг производительности системы

sysstat — удобная утилита для измерения и анализа производительности системы. Можно получить доступ к системным характеристикам (загруженность процессора, i/o wait, использование памяти и прочее) указав в качестве параметра временной интервал, например статистику за последний день можно получить так.

sar -u
Linux 2.6.32-5-686 (debian.server)    21.11.2013      _i686_  (1 CPU)
13:05:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
13:15:01        all      1,55      0,00      0,46      0,62      0,00     97,36
13:25:01        all      1,30      0,00      0,45      0,45      0,00     97,80
13:35:01        all      2,98      0,00      0,58      0,69      0,00     95,75
13:45:01        all      1,78      0,00      0,50      0,65      0,00     97,07
13:55:01        all      1,23      0,00      0,46      0,53      0,00     97,78
14:05:01        all      3,24      0,00      3,36      1,59      0,00     91,81
14:15:01        all      1,83      0,00      0,51      0,74      0,00     96,92
Среднее:        all      1,99      0,00      0,90      0,75      0,00     96,36

Читать далее Sysstat мониторинг производительности системы

Автостарт pptp туннеля Debian

В

/etc/init.d/

добавляем скрипт

#! /bin/sh
### BEGIN INIT INFO
# Provides:          pptp tunnel
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      1 0 6
# Short-Description: start pptp session
### END INIT INFO
case "$1" in
    start)
        pon <peer_name> &
        echo "PPTP Started"
        ;;
    stop)
        poff <peer_name_
        ip ro del <some_route_del>
        ip ro del <some_route_del>
        echo "PPTP Stopped"
        ;;
    *)
        echo "Usage: /etc/init.d/pptp-<peer_name> {start|stop}"
        exit 1
        ;;
esac
exit 0
insserv -v /etc/init.d/pptp-<peer_name>

Memcached/Johnny Cache Django 1.5 Debian

Ничего нового, просто чтобы не гуглить в очередной раз.

aptitude install memcached
pip install python-memcached
pip install johnny-cache

Конфиг memcached находится в /etc/memcached.conf, оставляю все значения по умолчанию.
В settings.py

INSTALLED_APPS = (
    # ...
    'johnny',
)
MIDDLEWARE_CLASSES = (
    'johnny.middleware.LocalStoreClearMiddleware',
    'johnny.middleware.QueryCacheMiddleware',
    # ...
)
CACHES = {
    'default' : dict(
        BACKEND = 'johnny.backends.memcached.MemcachedCache',
        LOCATION = ['127.0.0.1:11211'],
        JOHNNY_CACHE = True,
    )
}
JOHNNY_MIDDLEWARE_KEY_PREFIX='jc_myproj'

— префикс текущего проекта
Если у вас Django 1.5 и при пустых queryset вываливается ошибка

AttributeError: 'module' object has no attribute 'iter'

ставьте с гитхаба

git clone http://github.com/jmoiron/johnny-cache.git
cd johnny-cache && ./setup.py


Django + Sphinx + Debian

Ставим отсюда

https://github.com/FactorAG/django-sphinx

В settings.py

INSTALLED_APS= (
...
'djangosphinx',
...
)
# Sphinx 2.0.4/2.0.6/2.0.8
SPHINX_API_VERSION = 0x119

models.py

from djangosphinx.models import SphinxSearch
class Product(models.Model):
    brand = models.ForeignKey(Brand, verbose_name=u'Бренд')
    title = models.CharField(_(u'Марка'), max_length=50, blank=True)
    caption = models.CharField(_(u'Серия'), max_length=150, blank=True)
    composition = models.CharField(_(u'Ингредиенты'), max_length=60, blank=True, null=True)
    about = RichTextField(_(u'Описание'), blank=True)
    pub_date = models.DateTimeField(default=datetime.now)
    pet = models.ManyToManyField(Pet, verbose_name=u'Животное')
    updated = models.DateTimeField(auto_now=True)
    search = SphinxSearch(weights={'title': 90, 'caption': 80, 'about': 100, 'composition': 70},
                          mode='SPH_MATCH_ALL', rankmode="SPH_RANK_BM25", sort='SPH_SORT_RELEVANCE',
                          )

views.py

@render_to('core/entry_list.html')
def searcher(request):
    if 'srch' in request.GET and request.GET['srch']:
        txt = request.GET['srch']
        entries = Product.search.query(txt)
        return {'object_list': entries, }
    else:
        return root(request)

django-sphinx умеет создавать конфигурацию для Sphinx

./manage.py generate_sphinx_config <app_name> > config/sphinx.conf

Получившийся файл конфигурации нужно немного дополнить

source core_product
{
    type                = mysql
    sql_host            =
    sql_user            = <DB_user>
    sql_pass            = ******
    sql_db              = <DB>
    sql_port            =
    sql_query_pre       = SET NAMES utf8
    sql_query_post      =
    sql_query           = \
        SELECT id, onmain, brand_id, title, caption, gen_caption, composition, about, ext, pub_date, updated\
        FROM core_product
    sql_query_info      = SELECT * FROM `core_product` WHERE `id` = $id
    # ForeignKey's
    sql_attr_uint       = brand_id
    # DateField's and DateTimeField's
    sql_attr_timestamp   = pub_date
    sql_attr_timestamp   = updated
}
index core_product
{
    source          = core_product
    path            = /home/project/var/sphinx
    docinfo         = extern
    morphology      = stem_enru, Soundex, Metaphone
    charset_type    = utf-8
    min_word_len    = 2
    min_infix_len   = 2
    min_prefix_len  = 0
    enable_star     = 1
    charset_table = 0..9, A..Z->a..z, _, a..z, U+0401->U+0435, U+0451->U+0435, U+410..U+42F->U+430..U+44F, U+430..U+44F
    index_exact_words = 1
    expand_keywords   = 1
    index_sp=1
    html_index_attrs = img=alt,title; a=title;
    html_strip=1
}
indexer {
    mem_limit = 64M
}
searchd {
    listen = 9312
    listen = 9306:mysql41
    log = /home/project/logs/searchd.log
    query_log = /project/logs/query.log
    read_timeout = 5
    client_timeout = 300
    max_children = 30
    pid_file = /home/project/tmp/searchd.pid
    max_matches = 1000
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old = 1
    mva_updates_pool = 1M
    max_packet_size = 8M
    max_filters = 256
    max_filter_values = 4096
    max_batch_queries = 32
    workers = threads
}

Стваим Sphinx

  • Качаем исходники (есть готовые пакеты) отсюда
    http://sphinxsearch.com/downloads/release/
  • Распаковываем и конфигурируем
    tar xzvf sphinx-2.0.8-release.tar.gz
    sphinx-2.0.8-release
    ./configure --with-mysql
    make
  • Осталось собрать пакет и установить его в ситему (никогда не делайте make install, каждый раз, когда вы так делаете, умирает котенок)
    aptitude install checkinstall
    checkinstall

    теперь вы можете управлять пакетом с помощью пакетного менеджера.

Sphinx установлен, осталось проиндексировать БД и запустить демона.

indexer --config config/sphinx.conf --all

Для дальнейшей индексации можно использовать

indexer --config config/sphinx.conf --all --rotate

Для запуска

searchd -c config/sphinx.conf

Для остановки

searchd --stop -c config/sphinx.conf

Для повышения качества поиска можно использовать словарь словоформ

aptitude install myspell-ru
spelldump /usr/share/hunspell/ru_RU.dic /usr/share/hunspell/ru_RU.aff wordforms_ru_RU.txt
cat wordforms_ru_RU.txt | enca -L ru
iconv -f KOI8-R -t UTF-8 -o wordforms_ru_RU_UTF8.txt wordforms_ru_RU.txt

Затем подключаем его в sphinx.conf в раздел index

wordforms = /path/to/wordforms_ru_RU_UTF8.txt

Источники
http://sphinxsearch.com/docs/manual-2.0.8.html#supported-system

http://osmanov-dev-notes.blogspot.ru/2011/06/how-to-create-sphinx-wordform.html

http://proft.me/2011/01/22/polnotekstovyj-poisk-v-django/

http://habrahabr.ru/post/136261/

http://habrahabr.ru/post/147745/

http://habrahabr.ru/post/132118/

Соединение point-to-point в Debian и CentOS

Пример /etc/network/interfaces в Debian

iface eth0 inet static
        address <IP_ADDR>
        netmask 255.255.255.255
        gateway <GW_IP_ADDR>
        pointopoint <GW_IP_ADDR>

Можно через ifconfig

ifconfig eth0 inet <local_ip> netmask 255.255.255.255 pointopoint <destination_ip>
ip route add default via <destination_ip>

В CentOS чуть сложнее

  1. /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    HWADDR=<MAC address>
    ONBOOT=yes
    BOOTPROTO=static
    SCOPE="peer "
    IPADDR=<IP_ADDR>
    NETMASK=255.255.255.255
  2. /etc/sysconfig/network-scripts/route-eth0
    ADDRESS0=0.0.0.0
    NETMASK0=0.0.0.0
    GATEWAY0=<GW_IP_ADDR>

umask Debian Squeeze

Необходимо сделать, чтобы все новые папки создавались с правами 750, а файлы — 640. Для этого будем

 vim /etc/profile

Добавляем

umask 027


Далее

 vim /etc/pam.d/sshd 

Добавляем

session optional pam_umask.so umask=0027


Читать далее umask Debian Squeeze

GNU screen

GNU Screen — свободная консольная утилита-мультиплексор, предоставляющая пользователю доступ к нескольким сессиям в рамках одной сессии. Это полезно для работы с несколькими программами из командной строки, а также для запуска программ на удаленном сервере.

aptitude install screen

Запускаем новую сессию

screen

Теперь шелл запущен в screen сессии.
Команды screen

    1. Создать новое окно screen
      Ctrl+a c
      Ctrl+a Ctrl+c

Читать далее GNU screen