Проверить, существует ли файл локального сокета (т.е. /tmp/mysql.sock)?

#ruby #sockets

#ruby #сокеты

Вопрос:

Я пытаюсь выяснить, существует ли файл сокета.

IRB

 2.1.2 :001 > require 'socket'
 => true 
2.1.2 :002 > File.file? '/tmp/mysql.sock'
 => false
2.1.2 :003 > Socket.unix '/tmp/mysql.sock'
 => #<Socket:fd 9> 
  

Как вы можете видеть, файл сокета не является обычным файлом, поэтому Ruby возвращает false .

Любым другим способом (затем с помощью Socket.unix) проверить, существует ли файл сокета?

Ответ №1:

Вам просто нужно использовать File.socket? метод:

 File.file?('/var/run/mysqld/mysqld.sock')
# => false

File.socket?('/var/run/mysqld/mysqld.sock')
# => true
  

В качестве альтернативы вы можете использовать Pathname класс:

 Pathname.new('/var/run/mysqld/mysqld.sock').socket?
# => true
  

Комментарии:

1. Черт, так просто (никогда не проверял API), заставляет меня чувствовать себя глупо, спасибо!

Ответ №2:

Существует общий File.exist? метод, который проверяет, есть ли какой-либо тип записи файловой системы (каталог, файл, символическая ссылка, шаблон, устройство, что угодно …) по указанному пути.

Вы можете использовать его следующим образом:

 File.exist?('/var/run/mysqld/mysqld.sock')
# => true
  

Если вас не волнует тип файла, это, как правило, лучший подход.