Есть ли простой способ узнать, запущен ли уже скрипт Ruby, а затем обработать его соответствующим образом? Например: у меня есть сценарий с именем действительно_long_script.rb. У меня он настроен на запуск каждые 5 минут. Когда он запускается, я хочу увидеть, выполняется ли предыдущий запуск, а затем остановить выполнение второго сценария. Есть идеи?

В bash:
if ps aux | grep really_long_script.rb | grep -vq grep
then
echo Script already running
else
ruby really_long_script.rb
fi
PS - действительно плохой способ сделать это и, вероятно, открыт для условий гонки.
Традиционный способ Unix / Linux - записать PID в файл (обычно в / var / run) и проверить, существует ли этот файл при запуске.
например если файл pid находится в /var/run/myscript.pid, то перед запуском программы вы должны проверить, существует ли он. Есть несколько приемов, позволяющих избежать состояний гонки, связанных с использованием O_EXCL (исключая блокировку) для открытия файла и символических ссылок.
Однако маловероятно, что вам следует попытаться кодировать, чтобы избежать состояний гонки, используя атомарные операции в файловой системе.
Чтобы не изобретать колесо заново, вы можете взглянуть на http://rubyforge.org/projects/pidify/
Вероятно, вам также следует проверить, действительно ли процесс запущен, так что если ваш скрипт умирает, не очистив себя, он будет запущен в следующий раз, а не просто проверяет это. /var/run/foo.pid существует и закрывается.
Гем, обеспечивающий выполнение только одного экземпляра вашего основного скрипта. Короче говоря, может быть только один.
gem install highlander
require 'highlander' # This should be the -first- thing in your code.
# Your code here
А пока вернемся к командной строке ...
# First attempt, works. Assume it's running in the background.
ruby your_script.rb
# Second attempt while the first instance is still running, fails.
ruby your_script.rb # => RuntimeError
Простое требование самоцвета горец гарантирует, что только один экземпляр этого скрипта нельзя запустить снова. Если вы попытаетесь запустить его снова это вызовет RuntimeError.