How to gracefully shutdown emacs daemon?
Solution 1
This linuxquestions.org page has a Python script that can be run during login that listens for the 'save yourself' event that Gnome emits during shutdown. You could modify that to do the:
emacsclient -e '(save-buffers-kill-emacs)'
Official docs: https://www.emacswiki.org/emacs/EmacsAsDaemon#toc8
Solution 2
ShreevatsaR is right, the answer is kill-emacs
or save-buffers-kill-emacs
, both of which are interactive, and so can be run from within Emacs with M-x save-buffers-kill-emacs
. This is probably the best way to do it, since you will get to save modified files.
Another alternative is to make a shell file like this:
#!/bin/bash
emacsclient -e "(kill-emacs)"
Which you can run from wherever you like (menu icon, panel, etc).
Solution 3
Another addendum to ShreevatsaR: the python script works like a charm, but I'd suggest using
emacsclient -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))'
as command. Setting last-nonmenu-event to nil forces emacs into mouse-mode, so you get "nice" dialog boxes instead of prompts in the minibuffer.
Or even more fancy (somewhere in your emacs config):
(defun shutdown-emacs-server () (interactive)
(when (not (eq window-system 'x))
(message "Initializing x windows system.")
(x-initialize-window-system)
(when (not x-display-name) (setq x-display-name (getenv "DISPLAY")))
(select-frame (make-frame-on-display display '((window-system . x))))
)
(let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))
and then:
emacsclient -e '(shutdown-emacs-server)'
Solution 4
If you use systemd you may be interested in this unit file that lets you manage an Emacs server gracefully from within your console/remote system:
[Unit]
Description=Emacs: the extensible, self-documenting text editor
[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Restart=always
# Remove the limit in startup timeout, since emacs
# cloning and building all packages can take time
TimeoutStartSec=0
[Install]
WantedBy=default.target
(it kills the daemon in the same way folks already suggested above.)
You could put and name the unit file like ~/.config/systemd/user/emacs.service so it's bind to your user instead running it as root; to manage it:
$ systemctl --user {enable,disable,start,restart,stop} emacs.service
Please note: I took this note from somewhere else, can't remember where though.
Solution 5
I think that using a script in /etc/init.d is a cleaner solution. Check here for more details http://www.emacswiki.org/emacs/EmacsAsDaemon
projectshave
Updated on October 24, 2020Comments
-
projectshave over 3 years
On login to Ubuntu, I start an Emacs (version 23) daemon using Ubuntu's Startup programs. I then start Emacs clients whenever I need to edit something. When I logoff from Ubuntu, it says Emacs is still running, of course. I need to attach a script somewhere to tell Gnome to shutdown emacs when I logoff/shutdown.
1) What should the script look like? "kill-emacs" doesn't seem to work.
2) Where should I put this script? There's nothing in the startup programs (System->Sessions menu) panel that looks useful. I'd prefer something that works in the user's account, rather than hacking the PostSession script or something else with root access.
-
sidgeon smythe almost 15 yearsI think what the questioner wants is something that can be put in a place that is automatically executed when GNOME is asked to log out. (So it's more of a Gnome/Ubuntu/X question than an Emacs question, actually.)
-
projectshave almost 15 yearsThanks, but my post says I didn't want to use PostSession because it requires (AFAIK) root access to modify it. If a user can add something in autostart, there should be a way to add something to "autoshutdown".
-
tatsuhirosatou over 12 yearsI tested it under Ubuntu 11.10 and it works great!
-
chb almost 12 yearsSee this answer for why that's not a solution.
-
curot over 11 yearsPerhaps, but only if you're the only user of that machine. Even then it seems a little kludgey to have to specify a user the way presented there.
-
Andrea Richiardi over 9 yearsDoes it work if launched in a terminal? It keeps telling me: ERROR: Assertion failed: (not x-initialized)
-
Praxeolitic about 9 yearsIt's from the Emacs wiki. emacswiki.org/emacs/EmacsAsDaemon
-
CMCDragonkai about 7 yearsIs there a specific signal that the emacs daemon will listen to shutdown?
-
alper over 6 years
sudo killall emacs
also works @haxney -
BallpointBen about 6 yearsIf your system doesn't have a "save yourself" event, you can fake one by running a shell script on startup that traps on
EXIT
and reads from a fifo that you create for the purpose. The script will idle until trapping and then can run any function you assign -- such as one that callsemacsclient -e "(save-buffers-kill-emacs)"
-
alper almost 4 yearsIs there any way to check emacs daemon running on the background before running this line, where when I run it if emacs does not work on the background it logs long messages @genehack