tools.freebsd
2026-03-09
Parent:1dff2f4f424b
tools.freebsd/appdaemon.sh
* Устранение ошибок показа статуса при отказе запускаемого приложения
| awgur@0 | 1 #!/bin/sh |
| awgur@2 | 2 # devel.a0fs.net -- appdaemon -- v1.r202603.1 # |
| awgur@0 | 3 # $FreeBSD: head/www/uwsgi/files/uwsgi.in 340872 2014-01-24 00:14:07Z mat $ |
| awgur@0 | 4 # |
| awgur@0 | 5 # PROVIDE: appdaemon |
| awgur@0 | 6 # REQUIRE: DAEMON |
| awgur@0 | 7 # KEYWORD: shutdown |
| awgur@0 | 8 # |
| awgur@0 | 9 # Add the following lines to /etc/rc.conf to enable appdaemon: |
| awgur@0 | 10 # |
| awgur@0 | 11 # appdaemon_enable (bool): Set it to "YES" to enable appdaemon |
| awgur@0 | 12 # Default is "NO". |
| awgur@0 | 13 # appdaemon_piddir (path): Directory with pid files of apps |
| awgur@0 | 14 # Default "/var/run/appdaemon" |
| awgur@0 | 15 # appdaemon_pidfile (path): Set the path to the supervisor pid file |
| awgur@0 | 16 # Default is /var/run/appdaemon/${appName}.pid. |
| awgur@0 | 17 # appdaemon_app_pidfile (path): Set the path to the app pid file |
| awgur@0 | 18 # Default is /var/run/appdaemon/${appName}.app.pid. |
| awgur@0 | 19 # appdaemon_user (str): Set the UID of the process to run with |
| awgur@0 | 20 # Default is nobody. |
| awgur@0 | 21 # appdaemon_app (path): Application binnary. |
| awgur@0 | 22 # Default is "" |
| awgur@0 | 23 # appdaemon_chdir (path): Work directory of application |
| awgur@0 | 24 # Default is "/tmp" |
| awgur@0 | 25 # appdaemon_app_flags (str): Flags needed by binary |
| awgur@0 | 26 # Default is "" |
| awgur@0 | 27 # appdaemon_self (str): Binary of daemon program |
| awgur@0 | 28 # Default is "/usr/sbin/daemon" |
| awgur@0 | 29 # appdaemon_syslog_ident (srt): Log all output to syslog with this identity. |
| awgur@0 | 30 # Default is "" |
| awgur@0 | 31 # appdaemon_flags (str): Flags of daemon(8) command |
| awgur@0 | 32 # Default is "-fr" |
| awgur@0 | 33 # |
| awgur@0 | 34 # If you would like to have multiple instances running, you can |
| awgur@0 | 35 # define multiple profiles: |
| awgur@0 | 36 # |
| awgur@0 | 37 # appdaemon_profiles (str): Set the list of profiles |
| awgur@0 | 38 # Default is "". |
| awgur@0 | 39 # |
| awgur@0 | 40 # For each profile you can then define different options (except for |
| awgur@0 | 41 # appdaemon_enable) using the syntax appdaemon_<profile>_<option> |
| awgur@0 | 42 |
| awgur@0 | 43 . /etc/rc.subr |
| awgur@0 | 44 |
| awgur@0 | 45 name="appdaemon" |
| awgur@0 | 46 fsname="appdaemon" |
| awgur@0 | 47 rcvar=`set_rcvar` |
| awgur@0 | 48 extra_commands="list" |
| awgur@0 | 49 list_cmd="my_list" |
| awgur@0 | 50 |
| awgur@0 | 51 load_rc_config $name |
| awgur@0 | 52 |
| awgur@0 | 53 : ${appdaemon_enable:="NO"} |
| awgur@0 | 54 : ${appdaemon_profiles:=""} |
| awgur@0 | 55 : ${appdaemon_piddir:="/var/run/${fsname}"} |
| awgur@0 | 56 : ${appdaemon_pidfile:="${appdaemon_piddir}/master.pid"} |
| awgur@0 | 57 : ${appdaemon_app_pidfile:="${appdaemon_piddir}/app.pid"} |
| awgur@0 | 58 : ${appdaemon_app_flags:=""} |
| awgur@0 | 59 : ${appdaemon_user:="nobody"} |
| awgur@0 | 60 : ${appdaemon_app:=""} |
| awgur@0 | 61 : ${appdaemon_chdir:="/tmp"} |
| awgur@0 | 62 : ${appdaemon_flags:="-f"} |
| awgur@0 | 63 : ${appdaemon_self:="/usr/sbin/daemon"} |
| awgur@0 | 64 : ${appdaemon_syslog_ident:=""} |
| awgur@0 | 65 : ${_appdaemon_prefix:="/usr/local"} |
| awgur@0 | 66 : ${_appdaemon_instance:="appdaemon"} |
| awgur@0 | 67 |
| awgur@0 | 68 |
| awgur@0 | 69 is_my_profile() { |
| awgur@0 | 70 local profile |
| awgur@0 | 71 for profile in ${appdaemon_profiles} ; do |
| awgur@0 | 72 if [ "$profile" = "$1" ]; then |
| awgur@0 | 73 return 0 |
| awgur@0 | 74 fi |
| awgur@0 | 75 done |
| awgur@0 | 76 |
| awgur@0 | 77 return 1 |
| awgur@0 | 78 } |
| awgur@0 | 79 |
| awgur@0 | 80 my_err () { |
| awgur@0 | 81 err $1 "${_appdaemon_instance}: $2" |
| awgur@0 | 82 } |
| awgur@0 | 83 |
| awgur@0 | 84 my_list () { |
| awgur@0 | 85 if [ -z "${appdaemon_profiles}" ] ; then |
| awgur@0 | 86 echo "No profiles defineded" |
| awgur@0 | 87 else |
| awgur@0 | 88 echo "Profiles:" |
| awgur@0 | 89 for p in ${appdaemon_profiles} ; do |
| awgur@0 | 90 echo " - $p" |
| awgur@0 | 91 done |
| awgur@0 | 92 fi |
| awgur@0 | 93 echo "" |
| awgur@0 | 94 exit |
| awgur@0 | 95 } |
| awgur@0 | 96 |
| awgur@0 | 97 if ! checkyesno ${rcvar} ; then |
| awgur@0 | 98 exit 0 |
| awgur@0 | 99 fi |
| awgur@0 | 100 |
| awgur@0 | 101 if [ -n "${appdaemon_profiles}" ]; then |
| awgur@0 | 102 _process_profiles_flag="1" |
| awgur@0 | 103 for c in ${extra_commands} ; do |
| awgur@0 | 104 if [ "$1" = "$c" ] ; then |
| awgur@0 | 105 _process_profiles_flag="" |
| awgur@0 | 106 break |
| awgur@0 | 107 fi |
| awgur@0 | 108 done |
| awgur@0 | 109 if [ -n "$_process_profiles_flag" ] ; then |
| awgur@0 | 110 if [ -n "$2" ]; then |
| awgur@0 | 111 _profile="$2" |
| awgur@0 | 112 if ! is_my_profile $_profile; then |
| awgur@0 | 113 my_err 1 "$0: $_profile - no such profile defined in appdaemon_profiles." |
| awgur@0 | 114 fi |
| awgur@0 | 115 eval appdaemon_pidfile=\${appdaemon_${_profile}_pidfile:-"${appdaemon_piddir}/${_profile}.pid"} |
| awgur@0 | 116 eval appdaemon_app_pidfile=\${appdaemon_${_profile}_app_pidfile:-"${appdaemon_piddir}/${_profile}.app.pid"} |
| awgur@0 | 117 eval appdaemon_user=\${appdaemon_${_profile}_user:-"${appdaemon_user}"} |
| awgur@0 | 118 eval appdaemon_app_flags=\${appdaemon_${_profile}_app_flags:-"${appdaemon_app_flags}"} |
| awgur@0 | 119 eval appdaemon_self=\${appdaemon_${_profile}_self:-"${appdaemon_self}"} |
| awgur@0 | 120 eval appdaemon_app=\"\${appdaemon_${_profile}_app:-"${appdaemon_app}"}\" |
| awgur@0 | 121 eval appdaemon_chdir=\"\${appdaemon_${_profile}_chdir:-"${appdaemon_chdir}"}\" |
| awgur@0 | 122 eval appdaemon_flags=\"\${appdaemon_${_profile}_flags:-"${appdaemon_flags}"}\" |
| awgur@0 | 123 eval appdaemon_syslog_ident=\"\${appdaemon_${_profile}_syslog_ident:-"${appdaemon_syslog_ident}"}\" |
| awgur@0 | 124 _appdaemon_instance="${_profile}" |
| awgur@0 | 125 elif [ -n "$1" ]; then |
| awgur@0 | 126 for _profile in ${appdaemon_profiles}; do |
| awgur@0 | 127 echo "Processing ${name} profile: ${_profile}" |
| awgur@0 | 128 ${_appdaemon_prefix}/etc/rc.d/${fsname} $1 ${_profile} |
| awgur@0 | 129 done |
| awgur@0 | 130 exit 0 |
| awgur@0 | 131 fi |
| awgur@0 | 132 fi |
| awgur@0 | 133 fi |
| awgur@0 | 134 |
| awgur@0 | 135 my_start_precmd () { |
| awgur@0 | 136 # Checks |
| awgur@0 | 137 if [ -z "${appdaemon_app}" ] ; then |
| awgur@0 | 138 my_err 2 "command not set" |
| awgur@0 | 139 elif ! [ -x "${appdaemon_app}" ] ; then |
| awgur@0 | 140 my_err 3 "Command not found or not executable: ${appdaemon_app}" |
| awgur@0 | 141 fi |
| awgur@0 | 142 |
| awgur@0 | 143 if ! [ -e "${appdaemon_piddir}" ] ; then |
| awgur@0 | 144 mkdir -p "${appdaemon_piddir}" |
| awgur@0 | 145 fi |
| awgur@0 | 146 } |
| awgur@0 | 147 |
| awgur@0 | 148 my_start_postcmd () { |
| awgur@0 | 149 sleep 0.4 |
| awgur@0 | 150 local _app_pid=`cat "${appdaemon_app_pidfile}"` |
| awgur@0 | 151 local _d_pid=`cat "${appdaemon_pidfile}"` |
| awgur@0 | 152 sleep 1 |
| awgur@0 | 153 if ! [ "${_app_pid}" = "`cat "${appdaemon_app_pidfile}"`" ] ; then |
| awgur@0 | 154 if [ "${_d_pid}" ] ; then |
| awgur@0 | 155 kill -9 "${_d_pid}" |
| awgur@0 | 156 fi |
| awgur@0 | 157 my_err 10 "app not lounch. Check it" |
| awgur@0 | 158 fi |
| awgur@0 | 159 } |
| awgur@0 | 160 |
| awgur@0 | 161 my_status_postcmd () { |
| awgur@0 | 162 local _pids="" |
| awgur@0 | 163 if [ -f "${appdaemon_pidfile}" ] ; then |
| awgur@0 | 164 _pids="${_pids} -p `cat "${appdaemon_pidfile}"`" |
| awgur@0 | 165 fi |
| awgur@0 | 166 |
| awgur@2 | 167 if [ -f "${appdaemon_app_pidfile}" -a -n "$(cat "${appdaemon_app_pidfile}")" ] ; then |
| awgur@0 | 168 _pids="${_pids} -p `cat "${appdaemon_app_pidfile}"`" |
| awgur@0 | 169 fi |
| awgur@0 | 170 |
| awgur@0 | 171 if [ -n "${_pids}" ] ; then |
| awgur@0 | 172 echo "" |
| awgur@0 | 173 ps ux ${_pids} |
| awgur@0 | 174 echo "" |
| awgur@0 | 175 fi |
| awgur@0 | 176 } |
| awgur@0 | 177 |
| awgur@0 | 178 command="${appdaemon_self}" |
| awgur@0 | 179 command_args="-r ${appdaemon_flags} -P ${appdaemon_pidfile} -p ${appdaemon_app_pidfile} -u ${appdaemon_user} ${appdaemon_app} ${appdaemon_app_flags}" |
| awgur@0 | 180 |
| awgur@0 | 181 if [ "x${appdaemon_syslog_ident}" != "x" ] ; then |
| awgur@0 | 182 command_args="-ST ${appdaemon_syslog_ident} ${command_args}" |
| awgur@0 | 183 fi |
| awgur@0 | 184 |
| awgur@0 | 185 appdaemon_user="" |
| awgur@0 | 186 pidfile="${appdaemon_pidfile}" |
| awgur@0 | 187 start_precmd=my_start_precmd |
| awgur@0 | 188 start_postcmd=my_start_postcmd |
| awgur@0 | 189 status_postcmd=my_status_postcmd |
| awgur@1 | 190 run_rc_command "$1" |