суббота, 20 сентября 2008 г.

Запуск X приложений из крона

У начинающих линуксоидов, пытающихся запустить X приложения из крона, часто возникают сложности. Этих сложностей я насчитал 3 штуки, и сейчас мы их все разберём.

Но в начале хочу сказать, что все эти сложности могут проявляться и в других случаях - при попытках запустить графические приложения от root, поэтому для облегчения тестирования я буду использовать крышку ноутбука. Я буду ей махать, и при этом будет выполнятся скрипт /etc/acpi/default.sh. Точнее я буду просто давить маленькую кнопочку на ноутбуке, которая нажимается крышкой при закрытии. Эта кнопочка генерирует ACPI событие с группой "button" и событием "lid", по которому например можно гасить экран, или повергнуть систему в suspend. Причём скрипт запускается примерно в том-же окружении, что и cron-овские задачи, поэтому тестировать я буду здесь, а потом уже начисто проверять в cron. Намного проще нажать кнопку, чем ждать 1-2 минуты, не так ли?
Хотя, в системах , отличных от Gentoo, этот скриптик может оказаться в другом месте. Так что проверяйте всё сами - эксперимент, эксперимент и ещё раз эксперимент!

Итак, попробуем вывести на экран диалог с текстом. Для этого есть 2 программы:
1. xmessage - универсальная, не зависит от оконного менеджера, но не очень красивая.
Попробуйте запустить xmessage -center "Hello Sergey"
2. kdialog - в составе KDE
Пробуем так: kdialog --msgbox "Hello Sergey"

Я предпочитаю kdialog, как более симпатичный.
Пробуем использовать - вписываем вызов по событию lid:

lid)
kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

не забываем перенаправить все сообщения в /err, чтоб было над чем подумать.

Давим кнопочку - ничего не происходит (и не удивительно, зачем бы я тогда тут распинался?). Читаем /err, и видим что-то подобное этому:

/etc/acpi/default.sh: line 31: kdialog: команда не найдена

Язык может быть и другим - зависит от настроек локали. Но, допустим вам не нравится русский, или вместо сообщения вы получили какие-то кракозябы? Это легко исправить:

lid)
export LC_ALL=C
export LANG=C
kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

Теперь уже лучше:

/etc/acpi/default.sh: line 33: kdialog: command not found

Но почему происходит эта ошибка? Да потому что kdialog действительно not found - пути к ней не прописаны. Это можно исправить 2 способами - использовать полный путь, или модифицировать PATH
1.

lid)
export PATH=$PATH:/usr/kde/3.5/bin/
kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

2. Прописать полный путь

lid)
/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

Во этом случае нас могут подстерегать некоторые затруднения - если программа вызывает какую-то другую программу, то эта другая программа в свою очередь может не найтись! Везде прописывайте полные пути!

Получаем вот что:

kdialog: cannot connect to X server

Бедняжка не может найти X сервер... Нужно ему помочь! Опять таки 2 способа указать сервер:
1. Указать из командной строки
kdialog --msgbox "Hello Sergey" -display :0
2. Задать переменную DISPLAY:
export DISPLAY=":0"
Второй способ мне кажется более удобным, так как не все программы поддерживают опцию -display

Пробуем:

lid)
export DISPLAY=":0"
/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

И снова получаем получаем ошибку:

Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

kdialog: cannot connect to X server :0

Сервер найден, но он нас не пускает - секьюрити, панимаиш...
И снова есть несколько путей(ну это же Линукс!):
1. Использовать программу xhost, которая просто разрешает коннектиться к серверу всем. Не очень безопасно, не так ли? Тем не менее его можно применять, например, если вы сидите дома и никого не боитесь (aka "я в домике").
'xhost +' разрешает всем коннектиться к серверу. Но, запускать эту программу надо не из скрипта! При запуске из скрипта у программы нет прав, чтоб изменять права, поэтому эту команду нужно впихнуть либо в автозагрузку X сервера, либо выполнить самому. Где находится эта автозагрузка, я без понятия, поэтому дальше этот способ рассматривать не будем.
2. Для авторизации клиентов используется файл указанный в переменной окружения XAUTHORITY. Если переменная не задана - используется файл $HOME/.Xauthority
Поэтому попробуем руту подсунуть файл авторизации пользователя:

lid)
export XAUTHORITY="/home/sazarkevich/.Xauthority"
export DISPLAY=":0"
/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /err 2>&1
;;

И... Это работает!
3. Вариант похож на предыдущий, но просто в /root делаем ссылку на .Xauthority пользователя:
ln -s /home/sazarkevich/.Xauthority /root/.Xauthority
Клиент пытается авторизоваться на сервере, берёт файл авторизации $HOME/.Xauthority, а это оказывается файл уже авторизованного пользователя. Вуаля.
4. Последний вариант - запуск из под пользователя

lid)
export DISPLAY=":0"
su sazarkevich -c '/usr/kde/3.5/bin/kdialog --msgbox "Hello Sergey" > /tmp/err 2>&1'
;;

Заметьте, ошибки скидываем в /tmp/err, т.к. пользователь sazarkevich не имеет доступа к корневой директории!
При этом автоматически используется .Xauthority пользователя.

Конечно, это не вполне хорошее решение. Тут жёстко задан пользователь. Более того, вы всегда должны работать за сервером :0 - если вы запустите ещё один сервер, на него ничего выводится не будет.
Однако, если вы за компьютером работаете всегда под одним пользователем (не root, боже упаси), и не запускаете лишних X серверов, а это часто так и есть, то вариант вполне подходящий.

Теперь с учётом всех проблем пробуем запустить оповещение из cron-а:
1. Полный путь
2. задать DISPLAY
3. разрешить авторизацию

Если вы запускаете задачи крона пользователя (crontab -e -u sazarkevich), то 3-ий пункт не нужен - он автоматически выполняется по 4-ому методу.
Если почему-либо вы используете крон через root-а(crontab -e -u root), то 3-ий пункт необходим.

Вот примерно так:

SHELL=/bin/bash
DISPLAY=":0"
MAIL=sazarkevich
# Morning shotdown
0 9 * * * /usr/kde/3.5/bin/konsole -e /home/sazarkevich/bin/morning-poweroff.sh

Это у меня по утрам, в 9 часов, запускается консоль, в которой 60 секунд идёт обратный отсчёт. Если никто не позаботится нажать Ctrl+C во время обратного отсчёта - компьютер выключится. Если кто-то за ним в это время работает, то он может отменить выключение.

Вот так. Всё просто!

пятница, 19 сентября 2008 г.

Гимн ГАИ МВД Республики Беларусь

Я в общем-то не знал, что такое вообще существует. Гимн ГАИ... Они его что-ли с утра поют и перед дежурством?

Но не в этом дело. Хотят они себе гимн - их дело. Но такой гимн... Это сильно. Вот ссылка, скачать первый гимн. Кстати по стихам там никаких претензий, вся фишка в исполнении :)

Для тех, кто не станет качать, объясняю: гимн - чистый шансон. Единственно чего не хватает - это наблатыканой фени. А так - голос похож на Круга, так и ждёш

"Владимирский централ..."

;)

Полковник весь в делах.

Просадил сегодня 400 тысяч в казино под названием "бизнес по белоруски". Короче, я начинаю понимать, как это - вести бизнес в нашем хрустальном сосуде...

Но, по порядку.

Поехал сегодня утром узнать номера счетов, чтоб заплатить недобитков недоплаченные налоги. Перво-наперво зашёл в кабинет под загадочным названием "одно окно", но там видимо вообще ничего не делают, так как попросту переслали меня в другой кабинет. Оттуда отфутболили в третий, в котором, красящая ногти девушка, попросила обождать на коридоре. Погулял. Записал номера счетов со стенда и вернулся. Подошёл видимо как раз к моменту высыхания лака, ибо дальше меня приняли без проволочек, в спешном темпе - оказывается сразу после ногтей девушка спешит на совещание. Быстро выписала мне чего где нехватает, попутно выпытывая "ну признайтесь, вы же не платили" (а я не признавался), и убежала. Ну ладно, вроде всё что надо со мной, пора ехать в банк, где без меня скучает бухгалтер и платить по счетам.

По пути я заглянул в бумажку и занервничал: итого к уплате значилось 400 тысяч, а я с собой взял только 150 (до этого фигурировала цифра 100 и взял, так сказать, с запасом). А карточка у жены(ну вы же знаете этих жён...). Быстро звоню супруге, договариваюсь встретится и экспроприировать то что моё по праву - карточку, и продолжаю ехать в банк.

В банке бухгалтер смотрит на бумажку и грязно матерится(ну ладно, ладно... вздыхает). В бумажке говорится, что мы не уплатили подоходный налог за I квартал 2008 года. И это при том, что с 1 января 2008 мы этот налог не платим вообще - перешли на другую систему налогообложения. Бухгалтер звонит в налоговую и пытается узнать, откуда на нас свалилось это счастье? Оказывается, что в компьютер внесены данные, что мы подавали (а мы не подавали) какие-то акты о получении доходов и т.д., по которым нам начислен налог. Просим найти эти акты(а они должны храниться в налоговой) - их не могут найти. Актов нет, а цифры введены! Дурдом... Скорее всего данные просто ошибочно вбили, надо ехать ковырять этих горе налоговиков. Ладно, решили заплатить, а потом разбираться - главное чтоб банк видел меня всего в белом, и не крутил носом.

Зарегистрировали документы, и только собрались платить, как мне звонят из агентства, и сообщают, что БАНК ОДОБРИЛ КРЕДИТ. С одной стороны - ура, ура, ура, а с другой - а чего мы тут выёживаемся, платим не свои налоги? Но, платёжки-то зарегистрированы, надо платить, поэтому иду к банкомату... не работает. Иду в кассу - деньги с карточки можно снять только с 11.00. Капец какой-то. Ладно, тусуюсь полчаса, снимаю деньги и наконец оплачиваю то, что оплачивать и не стоило бы.

Еду на работу, звоню в агентство - у нас на завтра назначен нотариат, надо подписывать договоры всякие там. Но как утро начнётся, так оно и продолжится: документы оказывается не готовы. Нотариат будет только в конце следующей недели...

Короче, встал сегодня в 6 утра, на работу приехал к 12.00. 6 часов занимался не пойми чем - вёл бизнес... Зато наш, родной.

З.Ы. А квартиру мы наверное всё-таки купим :)

четверг, 18 сентября 2008 г.

Полковника завалили письмами

Вчера звонили из банка, чего-то уточняли.
Сегодня снова звонили с утра. Потом в обед позвонили, спросили телефон моей налоговой инспекции. А через пол часа позвонили и сказали, что у меня там с налогами не очень хорошо. Чего-то не заплачено :(

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

Короче, бухгалтер не знает, инспекция не сообщает, и тут в эту пакость наступает банк и видит меня, сплошь в догах и недоплатах.

Может получиться не смешно :(

среда, 17 сентября 2008 г.

Полковнику никто не пишет...

... и не звонит, и не телеграфирует.
Если предположить, что полковник - это я, то звонить должны были по поводу кредита ещё в понедельник, а то и в пятницу. Вчера позвонил сам - сказали, в банке какие-то технические неполадки, и как только так сразу и позвонят. Растёт опасение, что у них там сломался сервер гнилых отмазок, и кредит они хотят мне зарубить на корню. Это нехорошо...
С другой стороны понять их тоже можно: я же индивидуальный предприниматель, вещь в нашем государстве совершенно ненадёжная и эфемерная. Вот он есть, а вот его и нет - указом накрыло.

Вобщем, если откажут - переквалифицируюсь в управдомы.

четверг, 11 сентября 2008 г.

Кредит

Сдали в понедельник документы в Приорбанк для получения кредит на покупку квартиры.
Сидим, нервничаем - ждём результат, дадут ли? И если дадут, то сколько? Просили 48000 американских бабулек, но могут дать и меньше... А могут и вообще не дать. Обещали к концу недели или, в крайнем случае, в начале следующей огласить ответ.

Анкету заполнял пол дня. Куча вопросов и непонятных пунктов. А ещё добивают короткие места для ответов - под место работы жены отводится 10-15 клеточек. Ну и как вписать туда 'УЗ "Минская областная клиническая больница"'? Только по 3 буквы в клеточке, и то...

Вобщем, ждём-с...

понедельник, 1 сентября 2008 г.

Налоговая тоже шутит

Сегодня попёрся в налоговую, за справкой о доходах за последние 12 месяцев. Для банка. Кредит на квартиру значит взять хочу.
А в налоговую направился, потому что я индивидуальный предприниматель.
Всё бы ничего, но я туда вообще первый раз ехал - всё предыдущее время за меня отстреливалась бухгалтер. Я собственно вообще не в курсе чего там и как, я тока программировать обучен. Но, надо. Еду.

Ну, приехал, залез в одно окошко - послали. Пошёл в посланное - перенаправили к "своему" налоговому инспектору. А я знаю, кто он? Вообще, в первый раз слышу, что мне положен какой-то там "мой" инспектор. Стою, нервно дышу чистым воздухом(не курю потому что). Ну, думаю, капец: я зайду, и спрошу "а кто тут мой инспектор?". Как они должно быть удивятся. Занимаюсь, мол, коммерцией 3 года, а до сих пор с инспектором не познакомился. Ой, думаю, стыдно то как...

Ну ладно. Узнал я таки своего "шефа" - там на одном из стендиков, которые я изучал в тоске, было распределение инспекторов по районам. Мой значит - Иванов И.И. (фамилия изменена из соображений), и сидит он в 105 кабинете. Ладно, заходим в этот кабинетик и видим какую-то одинокую девушку, пьющую чай. На Иванова никак не тянет, поэтому я и спрашиваю(далее идёт реконструкция диалога):
- Э... Извините, а где я могу найти Иванова И.И. - спрашиваю я взволнованно
- А он тут не работает. Он в главной налоговой. - уверенно отвечает девушка.
- Э... Извините.... Э... - тут я понимаю, что лоханулся, и приехал наверное вообще не туда. Но адреса у меня нет, и поэтому я спрашиваю смущаясь: - а... адрес какой?
- Вообще-то я пошутила. - отвечает девушка с абсолютной выдержкой и серьёзнейшим лицом.

Ну, а дальше мы сработались. Она дала мне листок и сказала писать всё как есть заявление на справку. Потом вообще всё банально было, за исключением мелочей типа того, что я незнаю свой ИНН...

Вот такие вот шуточки. Жаль, она сразу призналась, а то я бы долго смеялся нервным смехом в главном отделении...
Но, шуточка железная, как и полагается настоящему, суровому инспектору. Ни один мускул не дрогнул в улыбке, только серьёзность на лице и прохлада в голосе...

Да-с...