-
-
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 |
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.
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
afterps
does nothing?"