LE Blog

Инженер с поэтической душой

03.02.2011 firtree_right Литра

В школе самым презираемым мной человеком был Виссарион Григорьевич Белинский. Возможно, я уже тогда чувствовал, насколько яд чужой авторитетной оценки окружающих явлений или меня самого способен отравить мою реальность. И старался от подобного себя оградить. Юношеский максимализм распространил ограждение на всю литературу, надолго лишив меня радости прочтения книги. Это было и до знакомства с творчеством Белинского, но когда я узнал о его существовании, то вся нелюбовь к тому, что кто-то выбирает, какие произведения мне «проходить», вылилась на него. Он как бы воплотил в себе ту фигуру, которая говорит, что в литературе важно, как нужно это интерпретировать и почему любить.

Всем моим друзьям я уже по несколько раз рассказал историю, которая даёт представление о масштабе катастрофы. Каждое лето я уезжал к бабушке в деревню. И меня заставляли отрываться от велосипеда и читать по часу в день книги из списка заданного на лето. И у меня была книга, в которой были два произведения: «повесть о настоящем человеке» и «судьба барабанщика». Так вот в этих ежедневных часовых муках я прочитал треть «судьбы барабанщика», пока понял, что «повесть о настоящем человеке» уже закончилась, и это совсем другая история.

Потом, конечно, долгие годы я учился (да и продолжаю до сих пор) самостоятельно определять, что из того, что делаю я или другие, мне нравится, а что нет. Шекспир так и остался для меня маленьким говнюком, Пелевин, не смотря на тухлые отзывы, всё так же нравится, «Цветочный крест», не смотря на Букер и понравившееся мне эпатажное начало, имеет сомнительную литературную ценность, а Ильф с Петровым появились в моей жизни поздновато: прочти я их в школе — полюбил бы ещё больше.

Не надо иметь искусствоведческое образование, чтобы определить, нравится тебе «Герника» Пикассо или нет. Есть, конечно, такая вещь, как вкус, но он критикой не воспитывается. А воспитывается он через соприкосновение по своей воле с большим количеством объектов творчества.

Поэтому, если у вас есть книга или спектакль, которые из последнего вам понравились (без объяснения причин), то порекомендуйте мне их в комментариях.

А если у вас завтра (то есть уже сегодня, 3-го февраля) есть свободное время вечером, то сходите на спектакль Паперного «Река». Сегодня (то есть уже вчера) у Иры был день рождения, и мы пошли на этот спектакль. И когда мы на него пошли, то я даже не знал, кто такой Алексей Паперный. Удовольствия от этого меньше не стало.

02.01.2011 firtree_right 2010

Ушедший год совместил в себе две, казалось бы, несовместимые тенденции: с одной стороны в течение всего года нарастало ощущение усталости и истощения, а с другой стороны весь год я ввязывался во всё более и более масштабные мероприятия. Результаты некоторых будут видны в наступившем году, а некоторых — и того далее.

♯♯♯

В формате хит-парада:

  1. Женщина года — моя прекрасная супруга.
  2. Природный катаклизм года — если выбирать между холодами зимы в январе, дымом торфяников в жару летом и ледяным дождём в декабре, то, безусловно, торфяники лидируют. Всё это время я был в Москве.
  3. Фильм года — Inception. Уже давно фильм не дарил мне устойчивого изменённого состояния сознания.
  4. Игра года — Mass Effect 2. Не так давно начал ещё одного персонажа и прошёл им первую часть игры и уже почти закончил вторую. С нетерпением жду третью, о выходе которой как раз объявили на VGA-2010
  5. Операционная система года — Google Android. Очень воодушевляет.
  6. Курорт года — остров Бали.
  7. Открытие года — Латвия.
  8. Прорыв года — ssh-туннель
  9. Компания года — neq4. Довольно большую часть моей жизни в этом году я посвятил вот этим ребятам. Мне очень нравится, что удаётся проявлять свои сильные стороны и иметь прикрытыми слабые. Так же отличное место для развития новых навыков.
  10. Трудность года — подчинённые. С одной стороны приходится учиться заново, а с другой — есть определённые трудности, которые были у меня с этим всегда.
  11. Самое странное увлечение года — Dog Whisperer. Было бы забавно узнать, как бы я реагировал на пса с о. Бали, если бы посмотрел эти передачи до того.

♯♯♯

Планов на наступивший год — огромное количество. Но всё это не для жж. Главное — чтобы дао было позабористее.

♯♯♯

С Новым Две Тысячи Одиннадцатым Годом!

21.11.2010 firtree_right Метод съёма

Кстати, про офисы. Мне уже приходилось участвовать в съёмах офисов. И каждый раз совершенно железно следующий офис лучше предыдущего. Это такое правило. С квартирами у меня так же было.

Офис в СГА мне нравится. Он отлично подходит под наши способы работы. И самое прикольное было в момент выбора. Мы посмотрели несколько офисов в разных местах и были разногласия и вопросы. Я, например, склонялся к офису на Винзаводе, Маше нравилась Арма ну и т.д. Но потом мы сели вчетвером и посовещались, и после этого стало совершенно однозначно понятно, что нужно снимать именно этот. И никаких споров и уговоров. Просто этот оказался самый подходящий.

20.11.2010 firtree_right Выплеск

Вот уже некоторое время мы сняли офис на территории Современной гуманитарной академии. Чтобы это написать, я ждал пока будут урегулированы формальности.

Здесь Советский Союз: проходная с пропусками, 17-тиминутная прогулка от метро, сдача ключей на охрану в таких трогательных тубусиках с пластилином, столовая работает до 15:00 (где можно пообедать за 150 рублей), списки уполномоченных пребывать не территории после 22:00. Короче, почти монастырские условия. Мне нравится. Даже общественный туалет на этаже забавляет. Возможно, это сказывается чтение огромной вызывающе одетой женщины в возрасте, нежно любимой программистами, но заходя в туалет иногда возникает мысль, что не смывший за собой мужчина хочет таким образом показать метафизической мамочке, что он хорошо покакал.

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

Я прямо так и представляю себе облапошенного начальника ИТ-службы академии, с которым не делятся ни те, что получают арендную плату, ни телепорт-сервис со своих бешеных тарифов на интернет, отшив его под предлогом, что у него в собственности шкафчики и розеточки. А он, такой, мечтательно закатывает глаза и подсчитывает свои активы: «В каждой комнате от 6 до 12 розеточек, каждая по 1800 рубликов, это же несметные богатства!» Но кого волнует судьба обманутого начальника службы (который просто не может от себя предлагать эти услуги по причине отсутствия лицензии на оказание услуг связи), если на всех документах и актах стоит печать телепорт-сервиса?

Короче говоря, мы сняли ещё одну комнату и захотели соединить наши владения в одну сеть. К этому моменту (прошла неделя) они уменьшили аппетиты до 850 рублей за розетку. До первого прихода специалиста прошла неделя, три письма-заявки и два телефонных звонка. Пришедший специалист во-первых заявил, что хочет усложнить жизнь себе и нам (воткнуть не один проводочек, а три), во-вторых он не может объяснить причины этого пожелания начальства. Когда я добрался до офиса, выяснилось, что специалист не прозвонил кабели, не проверил свою работу и соединения попросту нет. Ещё звонок, ещё приход специалиста, прозвон соединения. Сеть, наконец-то есть. На следующий день опять проблемы. Выясняется, что в соединении теряются пакеты. Новый вызов специалиста, который приходит только на следующий день, проверка кабелей на соответствие заявленной категории. Оказалось, что в одном из кабинетов НИ ОДНА розетка на стене не соответсвует заявленной категории соединения. Восемьсот пятьдесят, сука, рублей, две недели мытарств, чтобы соединить две комнаты!

Конечно, я купил Ёту, конечно, мы написали заявку на разрешение прокинуть свой кабель над потолком между комнатами, конечно, я буду всеми силами стараться не связываться с телепорт-сервисом. Потому что если твои безлимитные 8 мегабит в месяц стоят 18250 (восемьнадцать тысяч двести пятьдесят) рублей в месяц, то предоставлять розетки в комнатах по такой цене, с такими трудностями и такого качества — это мудачество. Всего в наших комнатах около 40 сетевых розеток. Половина отклеивается от стен, и 6 из остальных уже точно нельзя использовать. И хрен с ними.

07.11.2010 firtree_right Отдых

В выходные был какой-то временной сдвиг. Я был уверен, что отдыхаю до вторника, а оказалось что 8-е — это понедельник.

В качестве отдыха приобрёл и прошёл сюжетные DLC (загружаемый контент) к Mass Effect 2. Получил удовольствие, конечно. Даже на минуточку захотелось создать нового героя и пройти первую и вторую часть от начала до конца. Задумался, почему им нужно делать прогрессирующую шкалу плохиша или кибальчиша. Сюжетно мне нравятся выборы положительного героя: больше персонажей остаётся в живых, больше потом приколов. Но многие диалоги у отрицательного героя лучше подходят. А иному персонажу с ноги заехать — самая адекватная реакция. Но если выбирать то так, то так, то потом недоступны ни те ни другие опции.

Ходил на день рождения к другу. Он сказал мне, что снова бросил учиться в семинарии. На вопрос: «Почему?» — показал вот это. Сказал: «Тот, Кто создал такое, не может быть в Своём уме». Я его понимаю.

Написал статью про ротацию логов в приложениях на rails. Ира к ней нарисовала картинку. Надеюсь на продолжение плодотворного сотрудничества. Хотя обычно я дольше ищу и исследую сюжет для статьи, чем Ира рисует картинку.

А как вы провели выходные?

05.11.2010 firtree_right Ротация логов рельсового приложения

hay roller

Введение

Это уже давно известная тема, и я не претендую на открытие Америки, но для себя зафиксирую это знание.

Даже если вы используете капистрано для выкладывания проекта в сеть, логи приложения хранятся в одном и том же месте (папка shared/log и разрастаются до огромных размеров. Можно, конечно, запускать после каждого обновления файлов проекта комманду:

rake log:clear

Но есть более цивилизованные методы. Тем более, после определённого времени код проекта начинает обновляться всё реже и реже.

С помощью системы

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

Чтобы организовать это удовольствие для своего проекта нужно создать файл /etc/logrotate.d/my_project:

/path/to/my_project/shared/log/*.log {
  weekly
  missingok
  rotate 10
  nomail
  compress
  delaycompress
  sharedscripts
  postrotate
    touch /path/to/my_project/current/tmp/restart.txt
  endscript
}

Здесь написано:

  1. weekly — разбивать лог еженедельно;
  2. missingok — не выходить с ошибкой, если файла нет;
  3. rotate 10 — хранить 10 предыдущих томов;
  4. nomail — не высылать удаляемые тома на электронную почту;
  5. compress — архивировать;
  6. delaycompress — архивировать не сразу, т.к. после переименования файла и до перезапуска пэссенджера логи пишутся в тот же переименованный файл;
  7. sharedscripts — запускать скрипт один раз для всех логов по маске;
  8. postrotate...endscript — скрипт, который нужно запустить после ротации: в данном случае перезапустить пэссенджер.

Файлом должен владеть root:root. Теперь можно проверить и запустить принудительно, убедившись, что наш файл включается в общий список:

sudo logrotate -dv /etc/logrotate.conf
sudo logrotate -fv /etc/logrotate.conf

С помощью руби

В руби есть встроенный метод ротации логов. Достаточно в файе config/environment.rb написать внутри блока Rails::Initializer.run один из вариантов:

config.logger = Logger.new(config.log_path, "weekly")

или

config.logger = Logger.new(config.log_path, 10, 1.megabyte)

Первый вариант осуществляет ротацию раз в неделю, а второй — по достижении файлом размера в 1 мегабайт и хранит 10 старых томов. Только в данном случае архивацию, если она нужна, придётся организовывать отдельно.

Было бы интересно

Для логротейт можно написать такую маску, которая бы включала в себя все логи всех рельсовых проектов. Но мне неизвестен способ потом написать такой скрипт, который бы перезапускал именно те проекты, для которых была сделана ротация. Например, если логротэйт не нашёл нужного файла, то и скрипт не запустит. А если мы указываем путь типа /path/to/*/shared/.log, то и скрипт должен перебирать все эти проекты и создавать или просто менять дату редактирования файлов restart.txt. Или можно просто перезапускать апач.

Материалы для самостоятельного изучения

  1. Документация logrotate (по-русски)
  2. Что ещё можно делать с логами приложения на рельсах

03.11.2010 firtree_right Музыкальная пауза

Музыкой у нас заведует Ира. Уровень моего утончённого вкуса позволяет определить только, что Машина Времени и ЧайФ хорошо идут под пивасик, а Ленинград — под водочку. Чего хотя бы стоит папка otherworld, в которой лежат по одной-две песни совершенно разных исполнителей. При том, что песни понравились, у исполнителей я не слышал ни одного альбома целиком. Дикарские, что и говорить, повадки.

Ира слушает музыку исполнителями. По несколько альбомов. Или даже целыми эпохами. Совсем недавно из айПада по утрам звучали Пётр Лещенко и Майя Кристалинская. Исполнители и эпохи сменяют друг друга, а мне с моим восприятием заваливается в память какая-нибудь одна или две песни. И если я не успел сделать копию в свой otherworld, то потом совершенно невозможно что-либо найти. И если Ира знает даже то, что Шаляпин про Петра Лещенко говорил «Да, глупые песенки, хорошо поет» (хотя второй на айПаде у нас есть, а первого — не будет). То я потом с трудом помню, когда слышал песню, как она называлась и кто исполнял. Обычно мне ещё нравятся «дуэты»: не одна группа, а вместе с кем-то. Типа, как БиБи Кинг с Джимми Хендриксом слабали «Джонни Би Гуд».

Но сегодня мне приспичило настолько, что я сел и нашёл те две песни, которые слушала когда-то давно (в разное время) Ира, и которые вдруг начали напеваться у меня в голове. Послушайте и вы:

calexico & iron and wine — he lays in the reins emily haines & the soft skeleton — doctor blind

30.10.2010 firtree_right Двулично

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

Человек же способен сам считать себя рассудительным и справедливым, будучи эмоциональным и крайне пристрастным. Или быть неспособным изменить неэффективное поведение, будучи уверенным, что в этом деле он профессионал.

♯♯♯

Года два назад (а то и больше) мы обсуждали с Петровым возможный уэб-два-ноль-проект, которые называется «ненависть-ненависть-ненависть» (очень важно, когда пишешь название проекта каждый раз печатать слово, а не копи-пейстить). Суть проекта в том, что все приходят на сайт и пишут о том, что они ненавидят-ненавидят-ненавидят. Это было воодушевляюще, мы хихикали, а Петров потом, просмеявшись, сказал: «Представляешь, как почернеет душа у человека, который сделает такой проект?»

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

Это, кстати, удивительно, что я очень мало рассказываю в правильных словах о том, как мне что-то не нравится. Выбесить меня очень просто: достаточно просто показать себя чмошником-растяпой, и — хоп! — ненависть-ненависть-ненависть. С этой задачей прекрасно справляется 95% людей. Тогда мне кажется, что если над чмошником-растяпой иронично простебаться или не подать виду, то я такой, типа, уравновешенный. :)

Короче говоря, сюда будут попадать истории о том, как меня что-то, скажем так, расстроило. Начнём с последнего.

Сегодня мне прислали логин и пароль от корпоративной Ёты. Почему я вообще решил делать корпоративную Ёту — тема для отдельной записи. В целом я к ним достаточно лоялен. Даже не расстроился, когда мне по телефону сказали неправильный набор документов для подписания договора, и мне пришлось идти к ним лишний раз. И вот я ввожу эти временные логин и пароль, и меня просят ввести регистрационную информацию. И тут — сюрприз! — пользователь с такими телефоном и электронной почтой уже существует. Это я же и есть, но как физлицо. Звоню в корпоративную поддержку и мне говорят, что обязательно любому человеку, если он имеет личный аккаунт и отвечает за корпоративный нужно иметь два разных адреса электронной почты и два разных контакнтых телефона. Точка. Хоть усрись. Я, конечно же, остался к ним лоялен, но это АБСОЛЮТНО НЕЛЕПО!

24.10.2010 firtree_right Снова

Внезапно прервал виртуальную жизнь на три месяца. :) Даже не знаю, с чем это связано. Не помню, писал ли я уже об этом, но когда я в 2007-ом ушёл с работы, то для меня был довольно актуален вопрос: «чем же я хочу заниматься по жизни?» Нутро на вопросы не отвечало, поэтому я просто сел и выписал на бумагу то, чем я занимался в разные периоды своей жизни, начиная с 3 класса школы. И оказалось, что единственным, что присутствовало во все эти периоды, и сохранило мой интерес, было программирование. Это был забавный опыт, когда беспристрастный анализ на бумаге выявляет совсем не то, что ты привык про себя думать. Какое-то время ушло на то, чтобы сжиться с мыслью о себе-ещё-и-программисте (так, или иначе, около года), и тогда эта ипостась попёрла из меня со страшной силой. Сейчас всё стало заметно спокойнее. По крайней мере, я могу посвящать программированию один блог, а не два :)

Возможно, перерыв связан с тем, что когда интенсивно идут съёмки, то основная работа не в создании и придумывании нового, а в поддержке старого. Это кажется монотонным и недостойным внимания читателей. Или наоборот, придумывание нового было на такой зародышной стадии, что состояло в основном из тупки, а поддержка старого было единственной не-тупкой. Но в любом случае поддержка скучна [или не так весела].

Так или иначе, я написал про то, как определить, запущен ли демон.

♯♯♯

Ира подарила мне на день рождения книжку Гладуэлла, которая состоит из его статей в газету. Удивительно, до какой степени можно интересоваться людьми. Он как бы всё время воспроизводит тот опыт из детства, когда ты впервые узнаёшь, что внутри у другого человека всё устроено по-другому, и что многим не нравится то, что нравится тебе (и наоборот). Возможность посмотреть на мир глазами другого человека появляется уже в том возрасте, из которого есть чёткие воспоминания, да.

Но не суть. В общем, один из героев его статей был Цезарь Миллан  — в нашем переводе его шоу называется «переводчик с собачьего». В общем, мне стало очень любопытно, что он такое делает с собаками. А потом я поехал к родителям и увидел, что по Энимал Плэнет идёт как раз это шоу (я смотрю телевизор только у родителей). Потом приехал домой, и скачал ещё. Я не любитель собак или животных вообще. Но по какой-то причине я смотрел и смотрел это шоу, серия за серией.

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

Практические выводы такие:

  1. Для первого, наверное, нужно быть мной, чтобы понять, о чём я. Но нервозность, тревожность и прочие нежелательные состояния собаки происходят от того, что она считает себя главной, а значит ответственной за стаю. И если что-то случается неожиданное (другая собака, звук пылесоса, кто-то пришёл), то ей нужно иметь с этим дело, защищать стаю, контролировать ситуацию, но она не умеет этого делать в случае с пылесосом и микроволновкой, а в случае с гостем или другой собакой может только атаковать или отпугивать. Это как бы про то, что можно иметь с событиями дело тем или не тем местом :)

  2. Простые вещи работают круче интеллекта. Важно, в каком состоянии просыпаюсь, о чём первом думаю, в каком состоянии ложусь спать. Что делаю перед [или за] едой. Что делаю регулярно. Если проснуться и сходить прогуляться в магазин за завтраком до того, как его есть, то это меняет весь день. Нежелательные состояния легче переключать пока они не набрали интенсивность. Если регулярно возвращать себя в определённое состояние, это имеет ошеломляющий эффект. Вообще, заиметь или бросить привычку — это очень масштабное изменение жизни.

Такие дела. А что у вас?

20.10.2010 firtree_right Определение, запущен ли процесс

Пролог

Ого! Уже три месяца я ничего не писал в этот блог! Лето выдалось жаркое не только на погоду. Поскольку летом погода лучше, а световой день длиннее, было много работы. Причём работы связанной с поддержкой того, что уже и так нормально функционировало в прошлом сезоне. Ничего серьёзно нового не писалось активно, а значит и захватывающих сюжетов для статей не находилось.

Но теперь у меня появилась возможность писать кое-что новое. Поэтому есть, что рассказать.

to feed or not to feed

Введение

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

Баш в помощь

Предположим, что у нас есть простейший демон. Хорошо бы имя у него было уникальное, чтобы можно его потом было отыскать. Файл uniq_name_simple_daemon:

#!/usr/bin/env ruby

pid = fork do
  begin
    running = true
    Signal.trap("TERM") do
      running = false
    end
    while running
      sleep 0.01
    end
  rescue Exception => e
    puts e.to_s
    puts e.backtrace.join "\n"
  ensure
    exit!
  end
end

Мы всегда можем запускать с помощью другого скрипта, например на баше (simple_daemon_runner.sh):

#!/bin/bash

if ps ax | grep uniq_name_simple_daemon | grep -vq grep
then
  echo "uniq_name_simple_daemon is already running"
else
  echo "starting uniq_name_simple_daemon"
  ./uniq_name_simple_daemon
fi

На подобной команде будут базироваться все наши последующие методы. Тут, если кто не понял, мы фильтруем вывод ps ax сначала ища там имя нашего скрипта, а затем исключая из списка сам процесс поиска (команду grep). Ключ q позволяет нам получить код выхода, не выводя ничего на экран. То есть если строчка найдена, то запускаем первый блок, если нет, то второй.

Можно сделать такой же скрипт для остановки процесса (simple_daemon_stopper.sh):

#!/bin/bash

pid=$(ps ax | grep uniq_name_simple_daemon | grep -v grep | awk '{ print $1; }')

if [[ -n $pid ]]
then
  echo "stopping uniq_name_simple_daemon"
  kill -TERM $pid
else
  echo "nothing to stop"
fi

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

Сам себе хозяин

В данном случае задача сводится к проверке наличия в памяти ещё одного процесса с таким же именем кроме текущего. Так же нужно уметь останавливать процесс с помощью того же файла. Вот, какое решение получилось у меня (uniq_name_auto_daemon):

#!/usr/bin/env ruby

ps_ax = `ps ax | grep #{File.basename(__FILE__)} | grep -v grep`.split("\n").map{ |l| l.strip.split(/\s+/) }.reject{ |l| l[0].to_i == Process.pid }

if ps_ax.any?
  case ARGV[0]
    when /stop/i
      ps_ax.each do |l|
        system "kill -TERM #{l[0]}"
      end
    when /kill/i
      ps_ax.each do |l|
        system "kill -KILL #{l[0]}"
      end
    else
      puts "#{File.basename(__FILE__)} is already running. If you want to stop it, run './#{File.basename(__FILE__)} stop|kill'"
  end
else
  pid = fork do
    begin
      running = true
      Signal.trap("TERM") do
        running = false
      end
      while running
        sleep 0.01
      end
    rescue Exception => e
      puts e.to_s
      puts e.backtrace.join "\n"
    ensure
      exit!
    end
  end
end

Во-первых, обходимся одним файлом, который никак иначе не запустить. Во-вторых, нигде не нужно хардкодить его имя. По-моему, очень удобно.

Оффтопик

С одной стороны, когда я пишу текст, то мне удобнее писать все термины по-русски и склонять их: «демоны», «руби», «баш», но с другой стороны это не поможет тому, кто будет искать решение похожей задачи.

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

Что же делать? :)

Материалы для самостоятельного изучения

Полный код статьи на гитхабе.