Public bug reported:

I wrote a script to automatically edit a crontab across a fleet of machines.
The script works something like this:

   ex $crontab << EOT
    <ex commands to effect the changes I want>
   wq!
   EOT

I set EDITOR to point at that script, and then run "crontab -e", only to
find that the program says "No modification made". I carefully debugged
my script to ensure that it was actually making a change. In spite of
the change, crontab(1) claims "No modification made" and rejects the
changes.

After other attempts at troubleshooting failed, I delved into the source
code. The "No modification made" error is reported after "crontab"
checks the file modification time, which it does both before and after
calling $EDITOR.

The check is done like this:

            if (statbuf.st_mtime == fsbuf->st_mtime) {
                    return 1; /* No change to file */
            }

According to the stat(2) Linux man page, "st_mtime" is actually a macro
defined as:

    #define st_mtime st_mtim.tv_sec

So it seems that the problem is that editing a file by script takes less
than a second, and this method of checking a file's modification time
only provides 1-second resolution.

It seems that attempting to move away from using the st_mtime field
would introduce some portability problems, since Linux and MacOS X
provide incompatible ways to get subsecond precision on a file's
modification time.

In the meantime, I will call sleep(1) from my script to ensure that
enough time passes that crontab can see that there was a change.

** Affects: cron (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to cron in Ubuntu.
https://bugs.launchpad.net/bugs/1854891

Title:
  Editing crontab by script doesn't work

Status in cron package in Ubuntu:
  New

Bug description:
  I wrote a script to automatically edit a crontab across a fleet of machines.
  The script works something like this:

     ex $crontab << EOT
      <ex commands to effect the changes I want>
     wq!
     EOT

  I set EDITOR to point at that script, and then run "crontab -e", only
  to find that the program says "No modification made". I carefully
  debugged my script to ensure that it was actually making a change. In
  spite of the change, crontab(1) claims "No modification made" and
  rejects the changes.

  After other attempts at troubleshooting failed, I delved into the
  source code. The "No modification made" error is reported after
  "crontab" checks the file modification time, which it does both before
  and after calling $EDITOR.

  The check is done like this:

              if (statbuf.st_mtime == fsbuf->st_mtime) {
                      return 1; /* No change to file */
              }

  According to the stat(2) Linux man page, "st_mtime" is actually a
  macro defined as:

      #define st_mtime st_mtim.tv_sec

  So it seems that the problem is that editing a file by script takes
  less than a second, and this method of checking a file's modification
  time only provides 1-second resolution.

  It seems that attempting to move away from using the st_mtime field
  would introduce some portability problems, since Linux and MacOS X
  provide incompatible ways to get subsecond precision on a file's
  modification time.

  In the meantime, I will call sleep(1) from my script to ensure that
  enough time passes that crontab can see that there was a change.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/cron/+bug/1854891/+subscriptions

-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : touch-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to