Показаны сообщения с ярлыком bash. Показать все сообщения
Показаны сообщения с ярлыком bash. Показать все сообщения

2014-03-31

Запуск скрипта при старте и выключении CentOS Linux

Задача: в CentOS запускать некий скрипт "test.py" при старте и выключении компьютера от имени некоего пользователя. Для ее решения напишем init-скрипт, например "status_sender" и поместим его в каталог /etc/rc.d/init.d/

Содержимое init-скрипта:


#!/bin/bash

# chkconfig: 35 99 01
# description: Send system status
# processname: status_sender

. /etc/rc.d/init.d/functions

username="username"
lock_file=/var/lock/subsys/status_sender
log_datetime=`date -u +"%F %T"`

start(){
    touch "$lock_file"    
    daemon --user=$username /usr/local/bin/python2.7 "/home/$username/test.py" "Service started at $log_datetime UTC"  &>/dev/null & 
}

stop(){
    rm -f "$lock_file"
    daemon --user=$username /usr/local/bin/python2.7 "/home/$username/test.py" "Service stopped at $log_datetime UTC" &>/dev/null &
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
        exit 2
esac
exit 0

Скрипт готов, запускаем создание символических ссылок в соответствующих настройкам каталогах. Это можно сделать и вручную, но зачем?


chkconfig --add status_sender

Проверить результат можно командой


chkconfig --list status_sender

Настройки того, куда и с какими именами будут создаваться симлинки, задаются в строке "chkconfig: 35 99 01". Это означает, что скрипт будет актуален для запуска системы с уровнем 3 и 5, причем старт осуществлять после загрузки всех сервисов (99), а останавливать в первую очередь (01).

Запуск от имени пользователя осуществляется с помощью конструкции


daemon --user=$username

где "$username" - имя пользователя в системе, а "&>/dev/null" предотвращает вывод скрипта в консоль. Команда "daemon" и другие служебные функции находятся в файле "/etc/rc.d/init.d/functions", поэтому его мы импортируем в самом начале.

"lock_file" - служебный файл, который позволяет системе определять, запущен ли сервис и нужно ли его останавливать, запуская скрипт с параметром "stop" при выключении или презагрузке. Если его не создавать, то будет осуществляться только запуск скрипта, а если не удалять - то только остановка. Для системных сервисов такой файл создается автоматически, для пользовательских же его необходимо создать самостоятельно.

"log_datetime" - это строка даты и времени в UTC для передачи python-скрипту.

2012-05-28

GVim: открываем все файлы в одном окне

Что такое GVim: немного обGUIфицированная версия Vim. Что, впрочем, не мешает использовать ее без GUI-фич, просто мне шрифты показались там глаже.
По умолчанию GVim каждый файл открывает в отдельном окне, что не есть гуд. Даже Gedit открывает их во вкладках одного окна (если не глючит). Немного почитав доки, накидал вот такой скрипт:

#!/bin/bash
GVIM_COUNT=`ps -A | grep gvim | wc -l`
if [ $GVIM_COUNT -gt 0 ]; then
/usr/bin/gvim --remote-silent "$1"
else
/usr/bin/gvim "$1"
fi

Сохранил его в домашнюю папку:
/home/kawaikunee/bin/g_vim.sh
и сделал исполняемым:
chmod +x /home/kawaikunee/bin/g_vim.sh

Скрипт ищет запущенный инстанс GVim, если его нет - то открывает файл в обычном режиме в GVim, если есть - открывает его с параметром --remote-silent, в уже существующем окне. Если запустить с этим параметром сразу, то будет сначала открыт GVim, затем в нем создан пустой документ, а потом добавлен редактируемый файл. Итого - ненужный "Безымянный документ". Поэтому сначала проверим - есть открытое окно или нет.
Дальше откроем файл с правами администратора:
sudo gedit /usr/share/applications/gvim.desktop

Находим строку "Exec=gvim" и изменяем слово gvim на полный путь к своему скрипту:
Exec=/home/kawaikunee/bin/g_vim.sh %F

Сохраняем, проверяем. Теперь, открывая файлы с помощью GVim из Nautilus, все они будут в одном окне.
P.S. Естественно, у вас должен быть установлен vim-gnome.

2010-07-01

Чистим MKV-файлы от ненужных треков

Имеем: кучу файлов MKV (типа file-01.mkv, file-02.mkv ... file-24.mkv), в каждом из которых множество треков (видео, аудио, субтитры).
Нужно: оставить в них только одну видео- и одну звуковую дорожку.

Для работы с MKV нам понадобится одна утилита: mkvtoolnix
sudo apt-get install mkvtoolnix

Чтобы посмотреть, какие треки есть в файле, сделаем так:
mkvinfo file-01.mkv

Получаем довольно полную картину состава файла. Но нам нужна только часть, поэтому отфильтруем ненужное:
mkvinfo file-01.mkv | grep -Gi 'A track\|track number\|track type\|codec id\|Language'

| + A track
|  + Track number: 1
|  + Track type: video
|  + Codec ID: V_MPEG4/ISO/AVC
|  + Language: und
| + A track
|  + Track number: 2
|  + Track type: audio
|  + Codec ID: A_AAC
|  + Language: rus
| + A track
|  + Track number: 3
|  + Track type: audio
|  + Codec ID: A_AAC
|  + Language: jpn
| + A track
|  + Track number: 4
|  + Track type: subtitles
|  + Codec ID: S_TEXT/ASS
|  + Language: rus

Запоминаем номера нужных треков и их содержимое. Например, мне нужны только первый и третий трек. Берем их из исходного файла и создаем новый, содержащий только эти два трека:
mkvmerge file-01.mkv --vtracks 1 --atracks 3 -o file-01_.mkv
Если в файле только один видеотрек (как обычно и бывает), то достаточно и этого:
mkvmerge file-01.mkv -a 3 -o file-01_.mkv
Если субтитры тоже нужно включить, то
mkvmerge file-01.mkv -a 3 --stracks 4 -o file-01_.mkv

Ну а теперь, для пробы создадим копии первых пяти файлов, но только с нужными нам 1 и 3 треками:
for i in *{01..05}.mkv; do mkvmerge "$i" -a 3 -o "${i%.mkv}_.mkv"; done

Все получилось? Тогда можно и остальные обработать.

P.S. На всякий случай, если вы хотите вытащить оттуда субтитры в отдельный файл, то никто вам не мешает. К примеру, так:
mkvextract tracks file-01.mkv -c UTF-8 4:file-01.ass

2010-04-20

Функции в bash. Архивируй это!

Несмотря на два с половиной года использования Linux (вплотную с Ubuntu 7.10), как-то не вникал в тонкости shell-программирования. Ну цикл организовать, условия, выборки - пригождалось, но не белее того. Написал себе пару десятков alias-ов, для удобства, но чтобы обрабатывать опции командной строки писал отдельные скрипты на bash или python и складывал их в ~/bin, добавив путь к этой папке к переменной PATH.
Сравнительно недавно попалась на глаза информация о функциях в bash, и оказалось - это то, что мне нужно, чтобы не плодить скрипты. Они, оказывается, способны обрабатывать опции. В связи с этим, чтобы удобнее было создавать zip-архивы из чего угодно и поменьше тыкать по клавишам, накидал вот такую функцию, и поместил ее в ~/.bashrc

function zipp(){
    if [ -d "$1" ]; then out=`basename "$1"`".zip"; fi
    if [ -f "$1" ]; then out=`echo $1 | sed 's/\(.*\)\..*$/\1/g'`".zip"; fi
    zip -r -9 "$PWD/$out" "$1"
}

В ней проверяется, что сжимаем, каталог или файл, если файл - то отсекается расширение, если каталог - берется его имя без полного пути. После этого к имени добавляется ".zip", и передается архиватору как имя файла создаваемого архива.
Опции -r и -9 означают архивирование со всеми вложенными файлами с максимальной степенью сжатия.
Теперь, вместо того, чтобы писать в консоли
$ zip -9 -r myfolder.zip myfolder/

я пишу
$ zipp myfolder

Неправда ли, намного удобнее?