On 11 June 2017 at 17:06, Bruce Dubbs <[email protected]> wrote:

> Richard Melville wrote:
>
>>
>>
>> On 10 June 2017 at 20:41, Bruce Dubbs <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>>     Bruce Dubbs wrote:
>>
>>         Thomas Seeling wrote:
>>
>>             Hallo,
>>
>>
>>             I seem to have a serious misunderstanding how SysV init works
>> ...
>>             After building NFS support I could happily mount NFS
>>             filesystems from my
>>             NAS.
>>
>>             Then I did a reboot and noticed that the sequence of kill
>>             scripts is a
>>             bit ... unfortunate to say the least.
>>             First it removes the IP address from the network interfaces
>>             and only
>>             *then* it tries to unmount the "rest" of the filesystems.
>>             This does not work for NFS though - it hangs forever.
>>
>>             So I wrote a special kill script to unmount NFS and put it
>>             *before* the
>>             kill script for the interfaces.
>>             This works fine and I was happy.
>>
>>             At least for a short time - until I used the "poweroff"
>>             command and
>>             noticed that once again the sequence is not correct.
>>
>>             I thought the logic behind poweroff and reboot is the same but
>>             obviously
>>             there are different code paths.
>>
>>             Can somebody clue me in what I'm doing wrong?
>>
>>             Here are my init scripts as far as network and NFS are
>> concerned:
>>
>>             /etc/rc.d/init.d/:
>>             mountfs
>>             mountnetfs
>>             network
>>             nfs-client
>>
>>             /etc/rc.d/rc3.d/:
>>             S20network
>>             S30rpcbind
>>             S31nfs-client
>>
>>             /etc/rc.d/rc6.d/:
>>             K30nfs-client
>>             K30rpcbind
>>             K45mountnetfs
>>             K80network
>>             S99reboot
>>
>>
>>         For poweroff, the sequence needs to be defined in
>> /etc/rc.d/rc0.d/.
>>
>>         One of the boot scripts may need a minor correction.  We don't use
>>         nfs a
>>         lot so we might have a problem with shutdown.
>>
>>         The stop portion of mountfs does:
>>
>>         umount -a -d -r -t notmpfs,nosysfs,nodevtmpfs,noproc,nodevpts
>>          >/dev/null
>>
>>         Try adding a -f switch to that to force the umount when the
>> network is
>>         down.  In the meantime I'll think about a cleaner way to do the
>>         network
>>         umounts.  Perhaps the best place would be in the network stop
>>         script and add
>>
>>         umount -a -f -O _netdev >/dev/null
>>
>>         But that will not handle any network mounts that are not in fstab.
>>
>>         Any testing and feedback you can give will be appreciated.
>>
>>
>>     When considering network mounted filesystems we need to consider nfs,
>>     sshfs, and smb (samba) mounts.  One thing all these have in common is
>>     that the mounted device (first entry) in /proc/mounts has a colon
>>     specifying the host.
>>
>>     Adding the following to the *network* script should umount all these
>>     files.
>>
>>         stop)
>>            # Unmount any file systems mounted over the network
>>            # Read /proc/mounts and look for a colon in the first field
>>            for device in `cut -d" " -f1 /proc/mounts|grep :`; do
>>              umount -f $device 2>$1 >/dev/null
>>            done
>>         ...
>>
>>     What do you think?
>>
>>
>> I think that backticks are difficult to read, as opposed to $().
>>
>
> $() is specific to bash.  We try to keep the boot scripts Bourne Shell
> compatible.  I agree that $() is generally preferable, but not here.


Bruce, thanks for your answer.  I wasn't going to reply as it seems a
little like nit-picking, but, as {,B}LFS is primarily an educational
resource, I felt that your statement needed correcting, for the benefit of
newcomers.  They would be led to believe that they could not use $() for
any shell other than bash, but $() isn't a construct that's "specific to
bash". AFAIK all modern shells can use that command substitution
construct.  Indeed, bash borrowed the construct from the Korn shell is the
first place.  I can understand your desire for backwards compatibility, but
"Bourne Shell compatible" seems to me to be taking things a little too
far.  Besides, the $() construct is Posix compatible.

Richard
-- 
http://lists.linuxfromscratch.org/listinfo/blfs-support
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page

Reply via email to