daemonizer.sh 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #!/bin/bash
  2. PATH=$PATH:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin;
  3. _syntax() {
  4. echo "Syntax: $0 [start|stop|restart|status] {"as" Benutzer} [DAEMON] {Argumente}" >&2;
  5. echo " z.B.: $0 start as johnsmith /home/johnsmith/myscript.sh -c /home/johnsmith/myscript.conf";
  6. echo " oder $0 stop /root/myscript.sh";
  7. exit 2;
  8. }
  9. _check_daemon() {
  10. if [ ! -x "$DAEMON" ]; then
  11. echo "Das Programm $DAEMON existiert nicht oder ist nicht ausführbar." >&2
  12. echo "Wurde ein absoluter Pfad angegeben?" >&2
  13. exit 3;
  14. fi
  15. if [[ $(head -n 1 $DAEMON 2>/dev/null) =~ ^#\!/ ]]; then
  16. return 1;
  17. else
  18. return 0;
  19. fi
  20. }
  21. _start() {
  22. if [ "$ARGS" == "" ]; then
  23. echo "Starte $DAEMON ohne Argumente unter dem Benutzer $USER...";
  24. else
  25. echo "Starte $DAEMON mit den Argumenten \"$ARGS\" unter dem Benutzer $USER...";
  26. fi
  27. if _check_daemon; then
  28. start-stop-daemon --start -q -c $USER -u $USER -x $DAEMON -b -k 0002 -- $ARGS >/dev/null 2>&1; RES=$?;
  29. else
  30. if _status >/dev/null; then
  31. RES=1;
  32. else
  33. start-stop-daemon --start -q -c $USER -u $USER -x $DAEMON -b -k 0002 $PID -- $ARGS >/dev/null 2>&1; RES=$?;
  34. fi
  35. fi
  36. case "$RES" in
  37. 0) echo "Der Daemon wurde gestartet."; return 0; ;;
  38. 1) echo "Der Daemon lief bereits."; return 1; ;;
  39. *) echo "Der Start ist fehlgeschlafen."; return 1; ;;
  40. esac
  41. }
  42. _stop() {
  43. echo "Stoppe $DAEMON des Benutzers $USER...";
  44. if _check_daemon; then
  45. start-stop-daemon --stop -q -c $USER -u $USER -R TERM/5/KILL/2 -x $DAEMON >/dev/null 2>&1; RES=$?;
  46. else
  47. PID=$(pidof -s -x $DAEMON);
  48. if [ "$PID" == "" ]; then
  49. RES=1;
  50. else
  51. pkill -9 -P $PID;
  52. start-stop-daemon --stop -q -c $USER -u $USER -R TERM/5/KILL/2 --pid $PID >/dev/null 2>&1; RES=$?;
  53. if [ "$RES" != "0" ]; then RES="x"; fi
  54. fi
  55. fi
  56. case "$RES" in
  57. x) echo "Das Script wurde beendet."; return 0; ;;
  58. 0) echo "Der Daemon wurde beendet."; return 0; ;;
  59. 1) echo "Der Daemon läuft nicht."; return 1; ;;
  60. 2) echo "Der Daemon konnte trotz KILL nicht beendet werden."; return 1; ;;
  61. *) echo "Der Stop ist fehlgeschlafen."; return 1; ;;
  62. esac
  63. }
  64. _status() {
  65. echo "Status von $DAEMON des Benutzers $USER...";
  66. if _check_daemon; then
  67. start-stop-daemon --status -q -c $USER -u $USER -x $DAEMON >/dev/null 2>&1; RES=$?;
  68. else
  69. PID=$(pidof -s -x $DAEMON);
  70. if [ "$PID" == "" ]; then
  71. RES=3;
  72. else
  73. start-stop-daemon --status -q -c $USER -u $USER --pid $PID >/dev/null 2>&1; RES=$?;
  74. fi
  75. fi
  76. case "$RES" in
  77. 0) echo "Der Daemon läuft."; return 0; ;;
  78. 1|3) echo "Der Daemon läuft nicht."; return 1; ;;
  79. *) echo "Der Status konnte nicht abgefragt werden."; return 2; ;;
  80. esac
  81. }
  82. if [ "$(id -u)" != "0" ]; then
  83. echo "Dieses Tool muss mit root-Rechten ausgeführt werden." >&2
  84. exit 4;
  85. fi
  86. which start-stop-daemon >/dev/null 2>&1;
  87. if [ $? -ne 0 ]; then
  88. echo "Das Tool \"start-stop-daemon\" scheint nicht installiert zu sein." >&2
  89. exit 5;
  90. fi
  91. which pkill >/dev/null 2>&1;
  92. if [ $? -ne 0 ]; then
  93. echo "Das Tool \"pkill\" scheint nicht installiert zu sein." >&2
  94. exit 5;
  95. fi
  96. if [ "$2" == "as" ]; then
  97. [[ $# -lt 4 ]] && _syntax;
  98. id $3 >/dev/null 2>&1
  99. if [ $? -ne 0 ]; then
  100. echo "Der Benutzer $3 existiert nicht." >&2
  101. exit 3;
  102. else
  103. USER=$3;
  104. fi
  105. CMD=$1;
  106. DAEMON=$4;
  107. shift 4;
  108. ARGS=$@;
  109. else
  110. [[ $# -lt 2 ]] && _syntax;
  111. USER=root;
  112. CMD=$1;
  113. DAEMON=$2;
  114. shift 2;
  115. ARGS=$@;
  116. fi
  117. case "$CMD" in
  118. start)
  119. _start && exit 0 || exit 1;
  120. ;;
  121. stop)
  122. _stop && exit 0 || exit 1;
  123. ;;
  124. restart)
  125. _stop;
  126. _start && exit 0 || exit 1;
  127. ;;
  128. status)
  129. _status; exit $?;
  130. ;;
  131. *)
  132. echo "Unbekannter Befehl: $CMD" >&2;
  133. _syntax;
  134. ;;
  135. esac