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

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 мониторинг производительности системы

django-simple-history трекинг истории изменения объекта

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

pip install django-simple-history

В settings.py

INSTALLED_APPS = (...
    'simple_history',
...)

В models.py

from simple_history.models import HistoricalRecords
class Product(models.Model):
    ...
    history = HistoricalRecords()

Выполняем миграцию

./manage.py schemamigration <app_name> --auto
./manage.py migrate <app_name>

Далее в admin.py

from simple_history.admin import SimpleHistoryAdmin
class ProductAdmin(SimpleHistoryAdmin, admin.ModelAdmin):
    ...
admin.site.register(Product, ProductAdmin)

Теперь при нажатии на кнопку «История» объекта можно откатиться на выбранную ревизию.

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/

Установка Django в виртуальное окружение на сервере с CentOS

Подключаем репозиторий EPEL(i686)

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm

Для архитектуры x86_64

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Устанавливаем python-pip

yum install -y python-pip

Обновляем pip

pip-python install --upgrade pip
Downloading/unpacking pip
  Downloading pip-1.3.1.tar.gz (247Kb): 247Kb downloaded
  Running setup.py egg_info for package pip
    warning: no files found matching '*.html' under directory 'docs'
    warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
    no previously-included directories found matching 'docs/_build/_sources'
Installing collected packages: pip
  Found existing installation: pip 0.8
    Uninstalling pip:
      Successfully uninstalled pip
  Running setup.py install for pip
    warning: no files found matching '*.html' under directory 'docs'
    warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
    no previously-included directories found matching 'docs/_build/_sources'
    Installing pip script to /usr/bin
    Installing pip-2.6 script to /usr/bin
Successfully installed pip
Cleaning up...

Читать далее Установка Django в виртуальное окружение на сервере с CentOS

Соединение 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>

openVPN сервер под управлением CentOS

Будем устанавливать и настроивать openvpn сервер на CentOS
Сначала необходимо проверить наличе tun устройства, так как на VPS его может не быть

ls /dev/net/

вывод должен быть такой

[root@vpn 2.0]# ls /dev/net/
tun

Если вы не обнаружили файл устройства tun, обратитесь к своему провайдеру.
В стандартных репозитория CentOS и RHEL пакета openvpn нет. Поэтому сначала подключите репозитрий rpmforge

    1. Устанавливаем openvpn
      yum install openvpn -y

      openvpn CentOS

Читать далее openVPN сервер под управлением CentOS