#!/bin/bash get_ident() { local pid=$1 ps h -o lstart -p "$pid" } is_running() { local pidfile=$1 if [[ -f "$pidfile" ]]; then cat "$pidfile" | while read pid ident1; do ident2="$(get_ident "$pid")" if [[ "$ident1" = "$ident2" ]] && [[ -n "$ident2" ]]; then return 0 else return 1 fi done 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 "$@"