The issue: NFS fails to start in CentOS 7 if it cannot resolve any of a list of hosts. Well, my manager had to google to find the *truly* obscure solution that uses a deeply oddball syntax. In /usr/lib/systemd/system/nfs-server.service, you edit the following line so that it looks like this: ExecStartPre=-/usr/sbin/exportfs -r Notice the *deeply* weird syntax of "=-<cmd>". This apparently tells it that "a nonzero exit code" should be ignored and considered "success". And, I read in the manpage for systemd.service that if you precede it with an @, it will pass arguments. Why it does not use the used-everywhere-else of *post*fixing those parms, I have no data. And, speaking specifically about nfs-server.service, I also don't understand why you'd set as an out-of-the-box default that it should fail to come up if it can't resolve any export host, rather than default to coming up. mark, discovering new reasons to dislike systemd
> On Feb 3, 2016, at 10:57 AM, m.roth at 5-cent.us wrote: > > The issue: NFS fails to start in CentOS 7 if it cannot resolve any of a > list of hosts. > > Well, my manager had to google to find the *truly* obscure solution that > uses a deeply oddball syntax. > > In /usr/lib/systemd/system/nfs-server.service, you edit the following line > so that it looks like this: > ExecStartPre=-/usr/sbin/exportfs -r > > Notice the *deeply* weird syntax of "=-<cmd>". This apparently tells it > that "a nonzero exit code" should be ignored and considered "success?.Deeply weird or not, this is standard make (or at least gnu make) syntax. I wouldn?t be surprised if the developers thought it was completely normal.> > And, I read in the manpage for systemd.service that if you precede it with > an @, it will pass arguments. Why it does not use the used-everywhere-else > of *post*fixing those parms, I have no data.My reading of the man page is that arguments are always passed, and @ just means that the first ?argument? (i.e. 1st token after the executable name) is passed as argv[0] (which would normally the path of the executable itself). But that?s entirely based on the man page, no actual experience. Noam
On Feb 3, 2016, at 8:57 AM, m.roth at 5-cent.us wrote:> > Notice the *deeply* weird syntax of "=-<cmd>?.That syntax comes from make(1), where it means the same thing. make(1) has been with us since 1977, so I?d think ?old and familiar? is a better description than ?deeply weird.?> And, I read in the manpage for systemd.service that if you precede it with > an @, it will pass arguments. Why it does not use the used-everywhere-else > of *post*fixing those parms, I have no data.You?ve misread the page. All this option does is lets you run one command but tell the command itself that it was called by a different name. I?m not sure why the systemd creators added this, since you normally get this behavior with links: $ sudo yum install unzip $ ls -li /bin/unzip /bin/infozip 135096149 -rwxr-xr-x. 2 root root 181248 Mar 18 2015 unzip 135096149 -rwxr-xr-x. 2 root root 181248 Mar 18 2015 zipinfo That is, we have a single program binary with two different names. Invoking the program as ?zipinfo? makes it behave differently than if you invoke it as ?unzip?. All this systemd feature does is lets you say something like: ExecStart=@/bin/unzip zipinfo ... That is, you can run the unzip binary but *call it* zipinfo. Again, I don?t know why they couldn?t just do it with links. However, I will point out that the C programming interfaces on your system (execv() and friends) also support this feature, and have since back before 1977, so that this, too, is not some fresh new weirdness.> I also don't > understand why you'd set as an out-of-the-box default that it should fail > to come up if it can't resolve any export host, rather than default to > coming up.You do it for the same reason you?d fail when mounting any other filesystem. It may be critical to operation, as with shared /usr.
On 02/03/2016 08:59 AM, Warren Young wrote:> Again, I don?t know why they couldn?t just do it with links.Probably because they want to support a read-only root filesystem, working toward "stateless" systems.
El Mi?rcoles 03/02/2016, Warren Young escribi?:> On Feb 3, 2016, at 8:57 AM, m.roth at 5-cent.us wrote: > > Notice the *deeply* weird syntax of "=-<cmd>?. > > That syntax comes from make(1), where it means the same thing. make(1) has > been with us since 1977, so I?d think ?old and familiar? is a better > description than ?deeply weird.? > > > And, I read in the manpage for systemd.service that if you precede it > > with an @, it will pass arguments. Why it does not use the > > used-everywhere-else of *post*fixing those parms, I have no data. > > You?ve misread the page. > > All this option does is lets you run one command but tell the command > itself that it was called by a different name. I?m not sure why the > systemd creators added this, since you normally get this behavior with > links: > > $ sudo yum install unzip > $ ls -li /bin/unzip /bin/infozip > 135096149 -rwxr-xr-x. 2 root root 181248 Mar 18 2015 unzip > 135096149 -rwxr-xr-x. 2 root root 181248 Mar 18 2015 zipinfo > > That is, we have a single program binary with two different names. > Invoking the program as ?zipinfo? makes it behave differently than if you > invoke it as ?unzip?. > > All this systemd feature does is lets you say something like: > > ExecStart=@/bin/unzip zipinfo ... > > That is, you can run the unzip binary but *call it* zipinfo. > > Again, I don?t know why they couldn?t just do it with links. However, I > will point out that the C programming interfaces on your system (execv() > and friends) also support this feature, and have since back before 1977, so > that this, too, is not some fresh new weirdness.I guess that's probably to execute scripts and "hide" the name of the interpreter, e.g.: ExecStart=@/usr/bin/python my_cool_service --my_args> > I also don't > > understand why you'd set as an out-of-the-box default that it should fail > > to come up if it can't resolve any export host, rather than default to > > coming up. > > You do it for the same reason you?d fail when mounting any other > filesystem. It may be critical to operation, as with shared /usr.-- Ricardo J. Barberis Usuario Linux N? 250625: http://counter.li.org/ Usuario LFS N? 5121: http://www.linuxfromscratch.org/ Senior SysAdmin / IT Architect - www.DonWeb.com
Warren Young wrote:> On Feb 3, 2016, at 8:57 AM, m.roth at 5-cent.us wrote: >> >> I also don't understand why you'd set as an out-of-the-box default >> that it should fail to come up if it can't resolve any export host, >> rather than default to coming up. > > You do it for the same reason you?d fail when mounting any other > filesystem. It may be critical to operation, as with shared /usr.Beg pardon? The NFS server is offering it out, not requiring the f/s in. How could it be considered critical, as mounting / is? I can see it if *networking's* not up, but when it's only members of a list to whom it is available? mark