Перезагрузка процесса/сервера при изменении файлов

Когда код пишется на чуть менее распространённом чем ruby/python/php/js языке, встаёт задача arbitrary server restart on file change (рестарта произвольного сервера или процесса при изменении файла на диске).

Для JS есть замечательный grunt-contrib-watch, но если с ним влом разбираться, на помощь приходит inotify-tools (Linux) или fswatch (OS X / Mac). При этом для fswatch есть готовое решение.

Fswatch ставится через brew install fswatch и запускается вот так:

fswatch -o file.ext | xargs -n1 './restart_server.sh'

Лучше, конечно сделать небольшой файлик run_server.sh:

#!/bin/bash
bash restart_server.sh
fswatch -o file.ext | xargs -n1 './restart_server.sh'

А в restart_server.sh положить:

#!/bin/bash
server_file="file.ext"
start_serv_cmd="nohup interpreter_command $server_file > server.out &"
echo $start_node_cmd

echo 'There is a change in file, restarting node'
ps | grep "[i]nterpreter $server_file$" | awk '
{
if($1!="") {
print $1;
system("kill " $1)
}
}'

echo "starting server"
eval "$start_serv_cmd"

После этого при изменении файла file.ext, сервер сам будет запускать команду interpreter_cmd file.ext.

 

Kirill