Unix folklore: using multiple sync
commands
There is persistent bit of folklore in the Unix world that you should
do several sync
commands before shutting down or rebooting a Unix
machine. Even today, you'll see a lot of people following this
folklore, generally using 'sync; sync; sync
'.
People who do this irritate me, because they are doing it wrong and in a way that makes the whole folklore ineffectual.
The sync folklore dates from the very old days when Unix was primitive
and two things were true. First, the sync()
system call that the
sync
program uses just queued dirty buffers to be flushed and didn't
guarantee that they had been writing to disk. Second, the kernel
itself didn't force all buffers to be written to disk as part of the
shutdown or reboot process.
In this sort of old Unix environment, you needed to sync
by hand
before rebooting the system to get all the dirty buffers to disk. But
just one sync wouldn't necessarily do it; what you needed to do was
run sync
and then wait for a bit. But for some reason this was
never made an explicit part of the instructions; instead people were
told 'do several sync
commands, typing each by hand'. This should
take enough time that the buffer flush started by the first sync
would have completed by the time you ran reboot
(especially if you
were using a slow hardcopy console terminal, which was common then).
So the right command sequence of folklore is:
# sync # sync # sync # reboot
(Without typeahead, of course.)
But this mutated to just 'sync three times', so of course people
started writing 'sync; sync; sync
'. And then the whole mess
descended into folklore and superstition. (Sometimes you see people
advising that you should always run two or three sync
s instead of
one, even if you're not shutting down the system.)
These days it is an atrociously bad Unix system that doesn't
flush all buffers on shutdown by default, so the whole 'sync
before reboot' folklore is unnecessary. Often sync(2)
is also
synchronous (and thus the sync
command too), although the other
behavior is still permitted; see the
Single Unix Standard sync(2) manpage.
|
|