* cron-service @ 2016-04-30 17:27 Danny Milosavljevic 2016-05-01 13:14 ` cron-service Ludovic Courtès 0 siblings, 1 reply; 12+ messages in thread From: Danny Milosavljevic @ 2016-04-30 17:27 UTC (permalink / raw) To: guix-devel Hi, I've seen the mcron package but I don't understand how it gets launched. Should there be a cron-service ? How about the configuration which cron jobs to run? mcron can do both the traditional format and S-Expression format, so it would be possible to directly have the system cronjobs inside /etc/config.scm as an S-Expression. Does that work? ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: cron-service 2016-04-30 17:27 cron-service Danny Milosavljevic @ 2016-05-01 13:14 ` Ludovic Courtès 2016-05-17 17:28 ` fstrim and SSDs and cron; was: cron-service Danny Milosavljevic 0 siblings, 1 reply; 12+ messages in thread From: Ludovic Courtès @ 2016-05-01 13:14 UTC (permalink / raw) To: Danny Milosavljevic; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 781 bytes --] Hi! Danny Milosavljevic <dannym@scratchpost.org> skribis: > I've seen the mcron package but I don't understand how it gets launched. Should there be a cron-service ? Ah ha! I have a preliminary mcron service (attached). It’s undocumented and subject to change, but feedback is welcome! Currently it’s designed to run on ‘mcron’ process per user/group pair. Eventually, we’ll probably change mcron to allow us to run a single instance as root, and it will automatically setuid/setgid for each job. I told Mathieu Lirzin off-line about a couple of minor issues that would need to be fixed in his mcron branch¹, after which we can probably commit it (but let’s not put pressure on him!). Thanks, Ludo’. ¹ https://notabug.org/mthl/mcron [-- Attachment #2: mcron service --] [-- Type: text/plain, Size: 5370 bytes --] ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org> ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (gnu services mcron) #:use-module (gnu services) #:use-module (gnu services base) #:use-module (gnu services shepherd) #:autoload (gnu packages guile) (mcron) #:use-module (guix records) #:use-module (guix gexp) #:use-module (srfi srfi-1) #:use-module (ice-9 match) #:use-module (ice-9 vlist) #:export (mcron-configuration mcron-configuration? mcron-configuration-mcron mcron-configuration-jobs mcron-job mcron-job? mcron-job-user mcron-job-group mcron-job-specification mcron-job-imported-modules mcron-job-modules mcron-service-type mcron-service)) ;;; Commentary: ;;; ;;; This module implements a service that to run instances of GNU mcron, a ;;; periodic job execution daemon. Example of a service: ;; ;; (service mcron-service-type ;; (mcron-configuration ;; (jobs (list (mcron-job ;; (user "alice") ;; (specification ;; #~(job next-second-from ;; (lambda () ;; (call-with-output-file "/dev/console" ;; (lambda (port) ;; (display "hello!\n" port))))))))))) ;;; ;;; Code: (define-record-type* <mcron-configuration> mcron-configuration make-mcron-configuration mcron-configuration? (mcron mcron-configuration-mcron ;package (default mcron)) (jobs mcron-configuration-jobs ;list of <mcron-job> (default '()))) (define-record-type* <mcron-job> mcron-job make-mcron-job mcron-job? (user mcron-job-user (default "root")) ;string (group mcron-job-group (default #f)) ;string | #f (specification mcron-job-specification) ;gexp (imported-modules mcron-job-imported-modules ;list (default '())) (modules mcron-job-modules ;list (default '()))) (define (job-file job) (scheme-file "mcron-job" (mcron-job-specification job))) (define (mcron-shepherd-service mcron jobs) (match jobs ((($ <mcron-job> user group) _ ...) (shepherd-service (provision (list (string->symbol (string-append "mcron-" user (if group (string-append "-" group) ""))))) (requirement '(user-processes)) (start #~(make-forkexec-constructor (list (string-append #$mcron "/bin/mcron") #$@(map job-file jobs)) #:user #$user #:group #$(if user (or group #~(group:name (getgrgid (passwd:gid (getpw #$user))))) group))) (stop #~(make-kill-destructor)))))) (define mcron-shepherd-services (match-lambda (($ <mcron-configuration> mcron jobs) (define sorted-jobs (fold (lambda (job result) (match job (($ <mcron-job> user group) (vhash-cons (list user group) job result)))) vlist-null jobs)) (define users+groups (delete-duplicates (match jobs ((($ <mcron-job> users groups) ...) (zip users groups))))) (map (lambda (key) (mcron-shepherd-service mcron (vhash-fold* cons '() key sorted-jobs))) users+groups)))) (define mcron-service-type (service-type (name 'mcron) (extensions (list (service-extension shepherd-root-service-type mcron-shepherd-services))) (compose concatenate) (extend (lambda (config jobs) (mcron-configuration (inherit config) (jobs (append (mcron-configuration-jobs config) jobs))))))) (define* (mcron-service #:optional (mcron mcron)) (service mcron-service-type (mcron-configuration (mcron mcron)))) ;;; mcron.scm ends here [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #3: Type: text/x-patch, Size: 3930 bytes --] modified gnu/packages/guile.scm @@ -41,6 +41,7 @@ #:use-module (gnu packages ed) #:use-module (gnu packages base) #:use-module (gnu packages texinfo) + #:use-module (gnu packages man) #:use-module (gnu packages gettext) #:use-module (gnu packages databases) #:use-module (gnu packages python) @@ -424,6 +425,54 @@ Guile, so its configuration can be written in Scheme; the original cron format is also supported.") (license gpl3+))) +(define-public mcron2 + (let ((commit "573a09a32684c091cb8e8f521946f8bf90a295af")) + (package + (inherit mcron) + (name "mcron2") + (version (string-append (package-version mcron) "-0." + (string-take commit 7))) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://notabug.org/mthl/mcron/") + (commit commit))) + (sha256 + (base32 + "0m4kcpxmcr3rf6l6dd2z0m427gc2y1xx9z361j2zw3jgvamg0yhw")) + (file-name (string-append name "-" version "-checkout")))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("pkg-config" ,pkg-config) + ("texinfo" ,texinfo) + ("help2man" ,help2man))) + (arguments + `(#:modules ((ice-9 match) (ice-9 ftw) + ,@%gnu-build-system-modules) + + #:phases (modify-phases %standard-phases + (add-after 'unpack 'bootstrap + (lambda _ + (zero? (system* "autoreconf" "-vfi")))) + (add-after 'install 'wrap-mcron + (lambda* (#:key outputs #:allow-other-keys) + ;; Wrap the 'mcron' command to refer to the right + ;; modules. + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin")) + (site (string-append + out "/share/guile/site"))) + (match (scandir site) + (("." ".." version) + (let ((modules (string-append site "/" version))) + (wrap-program (string-append bin "/mcron") + `("GUILE_LOAD_PATH" ":" prefix + (,modules)) + `("GUILE_LOAD_COMPILED_PATH" ":" prefix + (,modules))) + #t)))))))))))) + (define-public guile-lib (package (name "guile-lib") modified gnu/system/examples/bare-bones.tmpl @@ -2,7 +2,7 @@ ;; for a "bare bones" setup, with no X11 display server. (use-modules (gnu)) -(use-service-modules networking ssh) +(use-service-modules networking ssh mcron) (use-package-modules admin) (operating-system @@ -42,6 +42,15 @@ ;; Add services to the baseline: a DHCP client and ;; an SSH server. - (services (cons* (dhcp-client-service) - (lsh-service #:port-number 2222) + (services (cons* (service mcron-service-type + (mcron-configuration + (jobs (list (mcron-job + (user "alice") + (specification + #~(job next-second-from + (lambda () + (call-with-output-file + "/dev/console" + (lambda (port) + (display "hello!\n" port))))))))))) %base-services))) ^ permalink raw reply [flat|nested] 12+ messages in thread
* fstrim and SSDs and cron; was: Re: cron-service 2016-05-01 13:14 ` cron-service Ludovic Courtès @ 2016-05-17 17:28 ` Danny Milosavljevic 2016-05-17 21:24 ` Ludovic Courtès 2016-06-23 8:18 ` mcron service Ludovic Courtès 0 siblings, 2 replies; 12+ messages in thread From: Danny Milosavljevic @ 2016-05-17 17:28 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel Hi Ludo, thanks. I can confirm that this works! I'm using it to regularily call fstrim (one has to regularily call fstrim on SSDs) so the mcron behaviour of, if an appointment was missed, doing it at the first next availability is good for regularity. The man page says that trimming once a week is good. Longer term maybe there should be a way of specifying that a filesystem should be trimmed in a "file-system" specification. Note that fstrim expects the filesystem to be mounted for it to work. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: fstrim and SSDs and cron; was: Re: cron-service 2016-05-17 17:28 ` fstrim and SSDs and cron; was: cron-service Danny Milosavljevic @ 2016-05-17 21:24 ` Ludovic Courtès 2016-05-18 1:56 ` Thompson, David 2016-05-18 5:21 ` Danny Milosavljevic 2016-06-23 8:18 ` mcron service Ludovic Courtès 1 sibling, 2 replies; 12+ messages in thread From: Ludovic Courtès @ 2016-05-17 21:24 UTC (permalink / raw) To: Danny Milosavljevic; +Cc: guix-devel Hi! Danny Milosavljevic <dannym@scratchpost.org> skribis: > I can confirm that this works! Great, thanks for testing. > I'm using it to regularily call fstrim (one has to regularily call > fstrim on SSDs) so the mcron behaviour of, if an appointment was > missed, doing it at the first next availability is good for > regularity. The man page says that trimming once a week is good. > > Longer term maybe there should be a way of specifying that a > filesystem should be trimmed in a "file-system" specification. Note > that fstrim expects the filesystem to be mounted for it to work. I had never thought of it, but maybe it’s a good idea. How do other distros handle it? Thanks, Ludo’. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: fstrim and SSDs and cron; was: Re: cron-service 2016-05-17 21:24 ` Ludovic Courtès @ 2016-05-18 1:56 ` Thompson, David 2016-05-18 5:09 ` Danny Milosavljevic 2016-05-18 5:21 ` Danny Milosavljevic 1 sibling, 1 reply; 12+ messages in thread From: Thompson, David @ 2016-05-18 1:56 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel On Tue, May 17, 2016 at 5:24 PM, Ludovic Courtès <ludo@gnu.org> wrote: > Hi! > > Danny Milosavljevic <dannym@scratchpost.org> skribis: > >> I can confirm that this works! > > Great, thanks for testing. > >> I'm using it to regularily call fstrim (one has to regularily call >> fstrim on SSDs) so the mcron behaviour of, if an appointment was >> missed, doing it at the first next availability is good for >> regularity. The man page says that trimming once a week is good. >> >> Longer term maybe there should be a way of specifying that a >> filesystem should be trimmed in a "file-system" specification. Note >> that fstrim expects the filesystem to be mounted for it to work. > > I had never thought of it, but maybe it’s a good idea. How do other > distros handle it? FWIW, I use SSDs in all my computers and have never run fstrim. Feels a lot like the "defragment your hard drive" days. - Dave ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: fstrim and SSDs and cron; was: Re: cron-service 2016-05-18 1:56 ` Thompson, David @ 2016-05-18 5:09 ` Danny Milosavljevic 0 siblings, 0 replies; 12+ messages in thread From: Danny Milosavljevic @ 2016-05-18 5:09 UTC (permalink / raw) To: Thompson, David; +Cc: guix-devel Hi, > FWIW, I use SSDs in all my computers and have never run fstrim. Feels > a lot like the "defragment your hard drive" days. If you would run it now then it would free many gigabytes. What it does and why it's needed: Traditionally filesystems on hard disks would just reuse sectors once they are not needed by the filesystem anymore. For example to delete a file it would just remove the filename and update the usage bitmap metadata. That's it. It wouldn't do anything to the payload sectors. Later on, the payload sector could maybe be used for another file's payload. For SSDs this is bad since they are trying to do wear levelling. SSDs work by providing an "hard-drive-like" interface to (many) flash blocks in hardware. A flash block can be written (actually: erased) only a limited number of times (< 5000). So there's an algorithm in the drive fireware which makes sure to evenly use all the flash blocks. If you keep writing the same sector, it will eventually move and remap it to another formerly-empty flash block. The problem with that is the "empty" in the last sentence. Which one is empty? As I said, the traditional filesystem wouldn't do anything to mark the payload setors as empty on the drive itself. Therefore, a command called "TRIM" was added to the SATA protocol (and other things). fstrim will send the command to the drive, informing it about sectors that are actually unused now. In this way the SSD has more possible targets to move stuff to. if you don't do it at all, the SSD will eventually run out of spare blocks and won't move stuff away anymore - which means one of the blocks is going to fail very soon (the ones that are written often - which are probably filesystem metadata blocks - maybe the usage bitmap). Of course it can still shuffle around used blocks - and probably does. Otherwise it would turn out to be very bad. There's also the "discard" mount option which automatically trims - but documentation says that it's caused longevity problems in the past for some drives (probably because it sends the TRIM command too often). ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: fstrim and SSDs and cron; was: Re: cron-service 2016-05-17 21:24 ` Ludovic Courtès 2016-05-18 1:56 ` Thompson, David @ 2016-05-18 5:21 ` Danny Milosavljevic 2016-05-18 8:50 ` Efraim Flashner 1 sibling, 1 reply; 12+ messages in thread From: Danny Milosavljevic @ 2016-05-18 5:21 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel > I had never thought of it, but maybe it’s a good idea. How do other > distros handle it? On <https://askubuntu.com/questions/18903/how-to-enable-trim> they say: >Ubuntu 14.10 onwards: >In Ubuntu 14.10 and 15.04, TRIMming happens automatically every week on all SSDs supported by fstrim. >$ tail -n1 /etc/cron.weekly/fstrim >/sbin/fstrim --all || true >Automatic TRIM (Deprecated, Slow): > [fstab...] >Encrypted Filesystems >The last step is not enough though. As long as LUKS is not aware that you want to use TRIM it will effectively block all TRIM operations coming from the LVM partition's file system, for security reasons. Add discard parameter to the cryptdevice options in /etc/crypttab to make LUKS accept the discard behavior of the LVM partition. >sda5_crypt UUID=e364d03f-[...]6cd7e none luks,discard More info about the latter: http://blog.neutrino.es/2013/howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/ Note that guix /gnu/store/8vg9124cgm8d36zsy9ldcw53b1vrfy2w-lvm2-2.02.109/etc/lvm/lvm.conf explicitly disables (!) "discard". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: fstrim and SSDs and cron; was: Re: cron-service 2016-05-18 5:21 ` Danny Milosavljevic @ 2016-05-18 8:50 ` Efraim Flashner 0 siblings, 0 replies; 12+ messages in thread From: Efraim Flashner @ 2016-05-18 8:50 UTC (permalink / raw) To: Danny Milosavljevic; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 2472 bytes --] On Wed, May 18, 2016 at 07:21:18AM +0200, Danny Milosavljevic wrote: > > I had never thought of it, but maybe it’s a good idea. How do other > > distros handle it? > > On <https://askubuntu.com/questions/18903/how-to-enable-trim> they say: > >Ubuntu 14.10 onwards: > >In Ubuntu 14.10 and 15.04, TRIMming happens automatically every week on all SSDs supported by fstrim. > >$ tail -n1 /etc/cron.weekly/fstrim > >/sbin/fstrim --all || true > > > > > >Automatic TRIM (Deprecated, Slow): > > [fstab...] > > >Encrypted Filesystems > >The last step is not enough though. As long as LUKS is not aware that you want to use TRIM it will effectively block all TRIM operations coming from the LVM partition's file system, for security reasons. Add discard parameter to the cryptdevice options in /etc/crypttab to make LUKS accept the discard behavior of the LVM partition. > >sda5_crypt UUID=e364d03f-[...]6cd7e none luks,discard > > More info about the latter: > > http://blog.neutrino.es/2013/howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/ > > Note that guix /gnu/store/8vg9124cgm8d36zsy9ldcw53b1vrfy2w-lvm2-2.02.109/etc/lvm/lvm.conf explicitly disables (!) "discard". > I have an SSD in my netbook, and I've had it a bit more than 4 years now. According to the smart data, it's been powered on for ~18,000 hours, and recently I saw the drive life percentage used counter tick from 2 to 3%, somewhere around 90 full disk writes. When changing data: Read block A, Write block B. With "dirty" block B: Read block A, Scrub block B, Write block B. Trim goes and scrubs all the now unused blocks so that they're ready for use. In many cases (aka not my machine, which is cpu bound on reads/writes) reading/writing to an SSD is limited by the SATA port's speed and the HDD based protocol. By trimming regularly (for me somewhere between weekly and monthly) you can save the bandwidth-limited transactions to the SSD for actual writes if you trim ahead of time. If we wanted to automatically trim for people without making mcron and its service part of %base-packages or %desktop-services we could add it as a hook before/after a `guix pull', but that seems too intrusive to me. -- Efraim Flashner <efraim@flashner.co.il> אפרים פלשנר GPG key = A28B F40C 3E55 1372 662D 14F7 41AA E7DC CA3D 8351 Confidentiality cannot be guaranteed on emails sent or received unencrypted [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* mcron service 2016-05-17 17:28 ` fstrim and SSDs and cron; was: cron-service Danny Milosavljevic 2016-05-17 21:24 ` Ludovic Courtès @ 2016-06-23 8:18 ` Ludovic Courtès 2016-06-24 5:59 ` Danny Milosavljevic 1 sibling, 1 reply; 12+ messages in thread From: Ludovic Courtès @ 2016-06-23 8:18 UTC (permalink / raw) To: Danny Milosavljevic; +Cc: guix-devel Hi! Commit c311089b0b19f094e44d3f858c29f77d757332d1 adds ‘mcron-service’. If you want to give it a try, your feedback is welcome! Excerpt from the manual below. Ludo’. 7.2.7.2 Scheduled Job Execution ............................... The ‘(gnu services mcron)’ module provides an interface to GNU mcron, a daemon to run jobs at scheduled times (*note (mcron)Top::). GNU mcron is similar to the traditional Unix ‘cron’ daemon; the main difference is that it is implemented in Guile Scheme, which provides a lot of flexibility when specifying the scheduling of jobs and their actions. For example, to define an operating system that runs the ‘updatedb’ (*note (find)Invoking updatedb::) and the ‘guix gc’ commands (*note Invoking guix gc::) daily: (use-modules (guix) (gnu) (gnu services mcron)) (define updatedb-job ;; Run 'updatedb' at 3 AM every day. #~(job '(next-hour '(3)) "updatedb --prunepaths='/tmp /var/tmp /gnu/store'")) (define garbage-collector-job ;; Collect garbage 5 minutes after midnight every day. #~(job "5 0 * * *" ;Vixie cron syntax "guix gc -F 1G")) (operating-system ;; ... (services (cons (mcron-service (list garbage-collector-job updatedb-job)) %base-services))) *Note mcron job specifications: (mcron)Guile Syntax, for more information on mcron job specifications. Below is the reference of the mcron service. -- Scheme Procedure: mcron-service JOBS [#:mcron MCRON2] Return an mcron service running MCRON that schedules JOBS, a list of gexps denoting mcron job specifications. This is a shorthand for: (service mcron-service-type (mcron-configuration (mcron mcron) (jobs jobs))) -- Scheme Variable: mcron-service-type This is the type of the ‘mcron’ service, whose value is an ‘mcron-configuration’ object. This service type can be the target of a service extension that provides it additional job specifications (*note Service Composition::). In other words, it is possible to define services that provide addition mcron jobs to run. -- Data Type: mcron-configuration Data type representing the configuration of mcron. ‘mcron’ (default: MCRON2) The mcron package to use. ‘jobs’ This is a list of gexps (*note G-Expressions::), where each gexp corresponds to an mcron job specification (*note mcron job specifications: (mcron)Syntax.). ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: mcron service 2016-06-23 8:18 ` mcron service Ludovic Courtès @ 2016-06-24 5:59 ` Danny Milosavljevic 2016-06-24 12:00 ` Ludovic Courtès 0 siblings, 1 reply; 12+ messages in thread From: Danny Milosavljevic @ 2016-06-24 5:59 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel Hi, I tried it out and can confirm that it still works. Nice! Just curious, how would I specify the user to run the job under now? How do I read the guix texinfo manual (using info) when the manual is not installed (i.e. read directly from the git checkout)? (Also, I wonder whether it would make any sense to be able to specify a list of packages that have to be installed because of the scheduled job(s). Otherwise it could for example be that updatedb isn't available, right?) ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: mcron service 2016-06-24 5:59 ` Danny Milosavljevic @ 2016-06-24 12:00 ` Ludovic Courtès 2016-06-24 14:18 ` Alex Kost 0 siblings, 1 reply; 12+ messages in thread From: Ludovic Courtès @ 2016-06-24 12:00 UTC (permalink / raw) To: Danny Milosavljevic; +Cc: guix-devel Hello, Danny Milosavljevic <dannym@scratchpost.org> skribis: > I tried it out and can confirm that it still works. Nice! Thanks for testing! > Just curious, how would I specify the user to run the job under now? Using Mathieu’s mcron branch (the ‘mcron2’ package, which is the default here), this is done via #:user, so: #~(job '(next-hour '(1)) do-something #:user "danny") I’ll add an example of this in the manual. > How do I read the guix texinfo manual (using info) when the manual is not installed (i.e. read directly from the git checkout)? Using the standalone Info reader, you can run: info -f ./doc/guix.info and using Emacs: C-u C-h i ./doc/guix.info RET > (Also, I wonder whether it would make any sense to be able to specify a list of packages that have to be installed because of the scheduled job(s). Otherwise it could for example be that updatedb isn't available, right?) I kept this example simple, but if you want to make sure it finds ‘updatedb’, you can write it as: #~(job … (string-append #$findutils "/bin/updatedb --foo")) And if you want to avoid issues related to shell quoting: #~(job … (lambda () (execl (string-append #$findutils "/bin/updatedb") "updatedb" "--foo"))) HTH! Ludo’. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: mcron service 2016-06-24 12:00 ` Ludovic Courtès @ 2016-06-24 14:18 ` Alex Kost 0 siblings, 0 replies; 12+ messages in thread From: Alex Kost @ 2016-06-24 14:18 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel Ludovic Courtès (2016-06-24 15:00 +0300) wrote: > Danny Milosavljevic <dannym@scratchpost.org> skribis: > >> How do I read the guix texinfo manual (using info) when the manual is not installed (i.e. read directly from the git checkout)? > > Using the standalone Info reader, you can run: > > info -f ./doc/guix.info > > and using Emacs: > > C-u C-h i ./doc/guix.info RET Or you can just press "I" on the .info file in a dired buffer. This "I" key (bound to 'dired-info') becomes available when you use 'dired-x'. I personally have the following in my ".emacs": (with-eval-after-load 'dired (require 'dired-x)) although the manual recommends another way: (info "(dired-x) Installation") -- Alex ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-06-24 14:19 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-04-30 17:27 cron-service Danny Milosavljevic 2016-05-01 13:14 ` cron-service Ludovic Courtès 2016-05-17 17:28 ` fstrim and SSDs and cron; was: cron-service Danny Milosavljevic 2016-05-17 21:24 ` Ludovic Courtès 2016-05-18 1:56 ` Thompson, David 2016-05-18 5:09 ` Danny Milosavljevic 2016-05-18 5:21 ` Danny Milosavljevic 2016-05-18 8:50 ` Efraim Flashner 2016-06-23 8:18 ` mcron service Ludovic Courtès 2016-06-24 5:59 ` Danny Milosavljevic 2016-06-24 12:00 ` Ludovic Courtès 2016-06-24 14:18 ` Alex Kost
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/guix.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).