-
-
Save oskapt/055d474d7bfef32c49469c1b53e8225f to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# Install this as `/etc/rc.netdata` and call it from `/etc/rc.local` | |
# to have it executed on boot. | |
NETDATA_DIR=/opt/netdata | |
DAEMON=$NETDATA_DIR/bin/srv/netdata | |
TIMEOUT=30 # seconds to wait for netdata to exit | |
[ -x $DAEMON ] || exit 0 | |
function get_pid() { | |
pid=$( ps ax | grep -v grep | grep -m 1 $DAEMON | awk '{ print $1 }' ) | |
} | |
function check_netdata() { | |
count=1 | |
while [ $count -lt $TIMEOUT ]; do | |
get_pid | |
if [ -z $pid ]; then | |
break | |
else | |
sleep 1 | |
count=$(( $count + 1)) | |
fi | |
done | |
if [ $count -eq $TIMEOUT ]; then | |
echo "Timeout exceeded waiting for netdata to exit." | |
echo "Use '$0 kill' to force netdata to exit." | |
exit 1 | |
fi | |
} | |
function stop_netdata() { | |
get_pid | |
if [ "x$pid" != "x" ]; then | |
if [ "x$1" = "xforce" ]; then | |
kill -9 $pid | |
else | |
kill $pid | |
fi | |
else | |
echo "No running netdata found." | |
fi | |
} | |
function start_netdata() { | |
get_pid | |
if [ "x$pid" = "x" ]; then | |
echo "Starting Netdata." | |
$DAEMON | |
else | |
echo "Netdata already running with pid $pid" | |
fi | |
} | |
case "$1" in | |
start) | |
start_netdata | |
;; | |
stop) | |
echo "Shutting down Netdata." | |
stop_netdata | |
;; | |
restart) | |
echo "Shutting down Netdata." | |
stop_netdata | |
if [ "x$pid" != "x" ]; then | |
echo "Waiting maximum of $TIMEOUT seconds for netdata to exit." | |
fi | |
check_netdata | |
start_netdata | |
;; | |
kill) | |
echo "Killing netdata." | |
stop_netdata force | |
;; | |
status) | |
get_pid | |
if [ "x$pid" != "x" ]; then | |
echo "Netdata running with PID $pid" | |
else | |
echo "No running netdata found." | |
fi | |
;; | |
*) | |
echo "Usage: $0 {start|stop|kill|restart|status}" | |
exit 1 | |
esac | |
exit 0 |
ps ax
shows all processes running on the host.grep -v grep
excludes the grep commandgrep -m 1 $DAEMON
returns the first match of whatever is in the variable$DAEMON
awk '{ print $1 }'
returns the first field (which is the pid)
The two grep lines were in the opposite order, which could, in an unusual circumstance, cause the grep line to be matched before $DAEMON
and then excluded, resulting in no matches. Flipping it around ensures that only $DAEMON
lines are included.
Doing it with square brackets is another way, but it's dependent on the shell. Using grep -v
is consistent across any shell I might be working in, or any scripts that I write.
Can you explain why you think that "grep
after ps
does nothing?"
Ah, you were fixing this
It's possible, but only if grep -v $DAEMON is earlier in the process list than "$DAEMON" itself. The only way that can happen is if this script is run before netdata is started, in which case netdata isn't running and will be started by the script.
I guess I didn't read or understand. So grep -v grep
is supposed to filter other grep $DAEMON
command that is running at the same time but also started before Netdata. I am not sure this can happen. But thanks for your detailed explanation.
I agree that it's not likely to ever happen, since it would require that the grep
command had a pid lower than the running netdata process. However, placing grep -v grep
first in the chain changes "unlikely to happen" to "will never happen," and that seemed reasonable.
Yeah, I mean the order -
ps ax | grep -v grep
. Whygrep
afterps
? It does nothing.On a side note: I usually do the following (first letter in square brackets)