#!/bin/bash # Copyright (C) 2011, 2013-2014 Luke Shumaker get_ident() { local pid=$1 cut -d ' ' -f 22 /proc/$pid/stat 2>/dev/null } is_running() { local pidfile=$1 if [[ -f "$pidfile" ]]; then read -r pid ident1 <"$pidfile" ident2="$(get_ident "$pid")" if [[ "$ident1" == "$ident2" ]] && [[ -n "$ident2" ]]; then return 0 else return 1 fi else return 1; fi } main() { # Parse arguments if [[ $1 = '-i' ]]; then shift id=$1 shift else id=$1 fi # Init variables TMP=${TMPDIR-/tmp}/daemon PIDFILE="$TMP/$id.pid" OUTFILE="$TMP/$id.out" ERRFILE="$TMP/$id.err" # Run if is_running "$PIDFILE"; then echo "daemon: \`$id' is already running" else mkdir -p "$TMP" echo "daemon: starting \`$id'" nohup "$@" > "$OUTFILE" 2> "$ERRFILE" & pid=$! echo "$pid" "$(get_ident $pid)" > "$PIDFILE" fi } main "$@"