Skip to content

Instantly share code, notes, and snippets.

@jedna
Created August 3, 2020 08:52
Show Gist options
  • Save jedna/43e8aed10bb788214886a7f7e100919f to your computer and use it in GitHub Desktop.
Save jedna/43e8aed10bb788214886a7f7e100919f to your computer and use it in GitHub Desktop.
Simple bash live reload for Go
#!/bin/bash
SERVER=/go/bin/api
# create directory for Delve logs, we use it to know that Delve
# debugger is running
mkdir -p /tmp/dlv_log
runServer() {
echo Running server
# create directory and file to
touch /tmp/dlv_log/output.log
# run server with debug
dlv --headless=true --continue --listen=:2345 --accept-multiclient --api-version=2 exec \
"$SERVER" | tee -a /tmp/dlv_log/output.log &
until serverPid=$(pidof $SERVER)
do
sleep 1
done
pidof dlv > /tmp/dlv.pid
echo "$serverPid" > /tmp/server.pid
echo Delve PID: "$(pidof dlv)", Server PID: "$serverPid"
}
killRunningServer() {
if [ -f /tmp/dlv.pid ]
then
echo killing old Delve, PID: "$(cat /tmp/dlv.pid)"
# we can't "wait" the process because it's not a child
kill "$(cat /tmp/dlv.pid)"
while [ -e /proc/"$(cat /tmp/dlv.pid)" ]; do sleep .5; done
rm -f /tmp/dlv.pid
fi
if [ -f /tmp/server.pid ]
then
echo killing old server, PID: "$(cat /tmp/server.pid)"
kill "$(cat /tmp/server.pid)"
while [ -e /proc/"$(cat /tmp/server.pid)" ]; do sleep .5; done
rm -f /tmp/server.pid
fi
}
buildServer() {
echo Building...
go install -gcflags="all=-N -l" ./...
}
rerunServer () {
buildServer
killRunningServer
runServer
}
lockBuild() {
# waiting for the file to delete
while [ -f /tmp/server.lock ]
do
sleep 1
done
touch /tmp/server.lock
}
unlockBuild() {
# remove lock file
rm -f /tmp/server.lock
}
# run the server for the first time
buildServer
runServer
inotifywait -e create,delete,modify -r -m --format "%f" ./ | while read -r file
do
lockBuild
if [[ $file == *.go ]]; then
echo File changed: "$file"
rerunServer
fi
unlockBuild
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment