├── README.creole └── initd /README.creole: -------------------------------------------------------------------------------- 1 | An init.d script for starting Emacs as a daemon. 2 | 3 | You can install this, as root, in init.d to start and stop an Emacs 4 | daemon at box boot. 5 | 6 | It supports the usual start/stop but also: 7 | 8 | * {{{status}}} reports the current status of the emacs daemon instance 9 | * {{{eval}}} evaluates lisp, for example: 10 | 11 | {{{ 12 | $ /etc/init.d/emacs eval '(emacs-uptime)' 13 | 1 hour, 47 minutes, 26 seconds 14 | }}} 15 | 16 | * {{{command}}} evaluates a command, just simpler function calling: 17 | 18 | {{{ 19 | $ /etc/init.d/emacs command 'elnode-start 8001 "localhost"' 20 | }}} 21 | 22 | * {{{install}}} installs a package, optionally from the specified archive: 23 | 24 | 25 | {{{ 26 | $ /etc/init.d/emacs install elnode /vagrant/my-elpa 27 | }}} 28 | 29 | -------------------------------------------------------------------------------- /initd: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | ### BEGIN INIT INFO 3 | # Provides: emacs 4 | # Default-Start: 2 3 4 5 5 | # Default-Stop: S 0 1 6 6 | # Description: This file should be placed in /etc/init.d. 7 | ### END INIT INFO 8 | 9 | USERNAME=emacs 10 | DESC="Run the emacs daemon." 11 | NAME=emacs 12 | USERHOME=/home/$USERNAME 13 | HOMEDIR=$USERHOME/emacs 14 | DAEMON=$HOMEDIR/bin/$NAME 15 | DAEMONNAME=server 16 | DAEMON_ARGS="--daemon=$DAEMONNAME" 17 | PIDFILE=/var/run/$NAME.pid 18 | SCRIPTNAME=/etc/init.d/$NAME 19 | VERBOSE="no" 20 | 21 | EMACSUID=`awk -F: "\\$1 ~ /$USERNAME/ {print \\$3}" /etc/passwd` 22 | EMACSCLIENT="sudo -u $USERNAME $HOMEDIR/bin/emacsclient -s /tmp/${USERNAME}${EMACSUID}/$DAEMONNAME" 23 | EVALEXIT="(progn (setq kill-emacs-hook nil) (kill-emacs))" 24 | 25 | 26 | # Exit if the package is not installed 27 | [ -x "$DAEMON" ] || exit 0 28 | 29 | # Read configuration variable file if it is present 30 | [ -r /etc/default/$NAME ] && . /etc/default/$NAME 31 | 32 | # Load the VERBOSE setting and other rcS variables 33 | [ -f /etc/default/rcS ] && . /etc/default/rcS 34 | 35 | # Define LSB log_* functions. 36 | # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. 37 | . /lib/lsb/init-functions 38 | 39 | do_install_me() 40 | { 41 | cat < /dev/null || return 1 80 | # Test directly with emacs 81 | $EMACSCLIENT -e '(emacs-pid)' > /dev/null 2>&1 82 | [ $? -eq 0 ] && return 1 83 | 84 | # Start the deamon 85 | # 86 | # NOTE: you cannot use start-stop-daemon for this because 87 | # emacs ends up with a root-owned user-init-file 88 | sudo su -c "$DAEMON $DAEMON_ARGS" - $USERNAME 89 | ret=$? 90 | [ $ret -ne 0 ] && return 2 91 | return 0 92 | } 93 | 94 | # 95 | # Function that stops the daemon/service 96 | # 97 | do_stop() 98 | { 99 | $EMACSCLIENT --eval "$EVALEXIT" > /dev/null 2>&1 100 | # Return 101 | # 0 if daemon has been stopped 102 | # 1 if daemon was already stopped 103 | # 2 if daemon could not be stopped 104 | # other if a failure occurred 105 | [ -f $PIDFILE ] && start-stop-daemon --stop --quiet \ 106 | --retry=TERM/30/KILL/5 \ 107 | --pidfile $PIDFILE \ 108 | --name $NAME 109 | RETVAL="$?" 110 | [ "$RETVAL" = 2 ] && return 2 111 | # Wait for children to finish too if this is a daemon that forks 112 | # and if the daemon is only ever run from this initscript. 113 | # If the above conditions are not satisfied then add some other code 114 | # that waits for the process to drop all resources that could be 115 | # needed by services started subsequently. A last resort is to 116 | # sleep for some time. 117 | start-stop-daemon --stop --quiet --oknodo \ 118 | --retry=0/30/KILL/5 \ 119 | --exec $DAEMON 120 | [ "$?" = 2 ] && return 2 121 | # Many daemons don't delete their pidfiles when they exit. 122 | rm -f $PIDFILE 123 | return "$RETVAL" 124 | } 125 | 126 | # 127 | # Function that sends a SIGHUP to the daemon/service 128 | # 129 | do_reload() { 130 | # If the daemon can reload its configuration without restarting 131 | # (for example, when it is sent a SIGHUP), then implement that 132 | # here. 133 | start-stop-daemon --stop --signal 1 --quiet \ 134 | --pidfile $PIDFILE \ 135 | --name $NAME 136 | return 0 137 | } 138 | 139 | do_status() { 140 | # Test the daemon with emacs 141 | $EMACSCLIENT -e '(emacs-pid)' > /dev/null 142 | return $? 143 | } 144 | 145 | do_eval() { 146 | # Test the daemon with emacs 147 | $EMACSCLIENT -e '(emacs-pid)' > /dev/null 148 | [ $? -ne 0 ] && return 1 149 | $EMACSCLIENT -e "$*" 150 | } 151 | 152 | do_install() { 153 | # Install a package from an archive 154 | # optionally supply the archive name 155 | $EMACSCLIENT -e '(emacs-pid)' > /dev/null 156 | [ $? -ne 0 ] && return 1 157 | if [ "$2" != "" ] 158 | then 159 | $EMACSCLIENT -e "(package-let (quote $1) \"$2\")" 160 | else 161 | $EMACSCLIENT -e "(package-install (quote $1))" 162 | fi 163 | } 164 | 165 | do_command() { 166 | # Test the daemon with emacs 167 | $EMACSCLIENT -e '(emacs-pid)' > /dev/null 168 | [ $? -ne 0 ] && return 1 169 | $EMACSCLIENT -e "($*)" 170 | } 171 | 172 | case "$1" in 173 | 174 | start) 175 | [ "$VERBOSE" != "no" ] && log_daemon_msg "Starting $DESC" "$NAME" 176 | do_start 177 | ret=$? 178 | [ $ret -eq 2 ] && log_end_msg 1 179 | exit 0 180 | ;; 181 | 182 | stop) 183 | [ "$VERBOSE" != "no" ] && log_daemon_msg "Stopping $DESC" "$NAME" 184 | do_stop 185 | case "$?" in 186 | 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 187 | 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 188 | esac 189 | ;; 190 | 191 | restart|force-reload) 192 | # 193 | # If the "reload" option is implemented then remove the 194 | # 'force-reload' alias 195 | # 196 | log_daemon_msg "Restarting $DESC" "$NAME" 197 | do_stop 198 | case "$?" in 199 | 0|1) 200 | do_start 201 | case "$?" in 202 | 0) log_end_msg 0 ;; 203 | 1) log_end_msg 1 ;; # Old process is still running 204 | *) log_end_msg 1 ;; # Failed to start 205 | esac 206 | ;; 207 | *) 208 | # Failed to stop 209 | log_end_msg 1 210 | ;; 211 | esac 212 | ;; 213 | 214 | status) 215 | do_status > /dev/null 2>&1 216 | ret=$? 217 | case "$ret" in 218 | 0) 219 | echo "emacs is running" 220 | ;; 221 | *) 222 | echo "no emacs" 223 | ;; 224 | esac 225 | [ $ret -eq 0 ] || exit $ret 226 | ;; 227 | 228 | e|eval) 229 | shift 230 | do_eval $* 231 | ret=$? 232 | [ $ret -eq 0 ] || exit $ret 233 | ;; 234 | 235 | command) 236 | shift 237 | do_command $* 238 | ret=$? 239 | [ $ret -eq 0 ] || exit $ret 240 | ;; 241 | 242 | install|package-install) 243 | shift 244 | do_install $* 245 | ret=$? 246 | [ $ret -eq 0 ] || exit $ret 247 | ;; 248 | 249 | *) 250 | echo "Usage: $SCRIPTNAME {start|stop|restart|status|install|eval|force-reload}" >&2 251 | exit 3 252 | ;; 253 | esac 254 | 255 | # End 256 | --------------------------------------------------------------------------------