Python, subprocess, dump, gzip and Cron

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Aidan

    Python, subprocess, dump, gzip and Cron

    Hi,

    I'm having a bit of trouble with a python script I wrote, though I'm not
    sure if it's related directly to python, or one of the other software
    packages...

    The situation is that I'm trying to create a system backup script that
    creates an image of the system, filters the output though gzip, and then
    uploads the data (via ftp) to a remote site.

    The problem is that when I run the script from the command line, it
    works as I expect it, but when it is run by cron I only get a 20 byte
    file where the compressed image should be... does anyone have any idea
    as to why this might be happening? Code follows

    <code>

    #!/usr/bin/python

    from subprocess import PIPE, Popen
    from ftplib import FTP

    host = 'box'

    filename = '%s.img.gz' % host
    ftp_host = '192.168.1.250'
    ftpuser, ftppass = 'admin', 'admin'
    dest_dir = '/share/%s' % host

    dump = Popen('dump 0uaf - /',shell=True,st dout=PIPE)
    gzip = Popen('gzip',sh ell=True,stdin= dump.stdout,std out=PIPE)

    ftp = FTP(ftp_host)
    ftp.login(ftpus er,ftppass)
    ftp.cwd(dest_di r)
    ftp.storbinary( 'STOR %s' % filename,gzip.s tdout)
    ftp.quit()

    print "Image '%s' created" % filename

    </code>

    I appreciate all feedback. Thanks in advance.
  • TT

    #2
    Re: Python, subprocess, dump, gzip and Cron

    On Jun 10, 2:37 pm, Aidan <awe...@gmail.c omwrote:
    Hi,
    >
    I'm having a bit of trouble with a python script I wrote, though I'm not
    sure if it's related directly to python, or one of the other software
    packages...
    >
    The situation is that I'm trying to create a system backup script that
    creates an image of the system, filters the output though gzip, and then
    uploads the data (via ftp) to a remote site.
    >
    The problem is that when I run the script from the command line, it
    works as I expect it, but when it is run by cron I only get a 20 byte
    file where the compressed image should be...  does anyone have any idea
    as to why this might be happening?  Code follows
    >
    <code>
    >
    #!/usr/bin/python
    >
    from subprocess import PIPE, Popen
    from ftplib import FTP
    >
    host = 'box'
    >
    filename = '%s.img.gz' % host
    ftp_host = '192.168.1.250'
    ftpuser, ftppass = 'admin', 'admin'
    dest_dir = '/share/%s' % host
    >
    dump = Popen('dump 0uaf - /',shell=True,st dout=PIPE)
    gzip = Popen('gzip',sh ell=True,stdin= dump.stdout,std out=PIPE)
    >
    ftp = FTP(ftp_host)
    ftp.login(ftpus er,ftppass)
    ftp.cwd(dest_di r)
    ftp.storbinary( 'STOR %s' % filename,gzip.s tdout)
    ftp.quit()
    >
    print "Image '%s' created" % filename
    >
    </code>
    >
    I appreciate all feedback.  Thanks in advance.
    it's possible that the cron doesn't have the environment variables you
    have, especially $PATH. So the script failed to find the command it
    need to create the image.

    Comment

    • Aidan

      #3
      Re: Python, subprocess, dump, gzip and Cron

      TT wrote:
      On Jun 10, 2:37 pm, Aidan <awe...@gmail.c omwrote:
      >Hi,
      >>
      >I'm having a bit of trouble with a python script I wrote, though I'm not
      >sure if it's related directly to python, or one of the other software
      >packages...
      >>
      >The situation is that I'm trying to create a system backup script that
      >creates an image of the system, filters the output though gzip, and then
      >uploads the data (via ftp) to a remote site.
      >>
      >The problem is that when I run the script from the command line, it
      >works as I expect it, but when it is run by cron I only get a 20 byte
      >file where the compressed image should be... does anyone have any idea
      >as to why this might be happening? Code follows
      >>
      ><code>
      >>
      >#!/usr/bin/python
      >>
      >from subprocess import PIPE, Popen
      >from ftplib import FTP
      >>
      >host = 'box'
      >>
      >filename = '%s.img.gz' % host
      >ftp_host = '192.168.1.250'
      >ftpuser, ftppass = 'admin', 'admin'
      >dest_dir = '/share/%s' % host
      >>
      >dump = Popen('dump 0uaf - /',shell=True,st dout=PIPE)
      >gzip = Popen('gzip',sh ell=True,stdin= dump.stdout,std out=PIPE)
      >>
      >ftp = FTP(ftp_host)
      >ftp.login(ftpu ser,ftppass)
      >ftp.cwd(dest_d ir)
      >ftp.storbinary ('STOR %s' % filename,gzip.s tdout)
      >ftp.quit()
      >>
      >print "Image '%s' created" % filename
      >>
      ></code>
      >>
      >I appreciate all feedback. Thanks in advance.
      >
      it's possible that the cron doesn't have the environment variables you
      have, especially $PATH. So the script failed to find the command it
      need to create the image.
      *fore head slap*

      Of course... adding the full path to both those utilities on the Popen
      lines seems to have fixed it.

      Thank you very much for your assistance.

      Comment

      • Sebastian \lunar\ Wiesner

        #4
        Re: Python, subprocess, dump, gzip and Cron

        Aidan <aweraw@gmail.c omat Dienstag 10 Juni 2008 07:21:
        TT wrote:
        >On Jun 10, 2:37 pm, Aidan <awe...@gmail.c omwrote:
        >>Hi,
        >>>
        >>I'm having a bit of trouble with a python script I wrote, though I'm not
        >>sure if it's related directly to python, or one of the other software
        >>packages...
        >>>
        >>The situation is that I'm trying to create a system backup script that
        >>creates an image of the system, filters the output though gzip, and then
        >>uploads the data (via ftp) to a remote site.
        >>>
        >>The problem is that when I run the script from the command line, it
        >>works as I expect it, but when it is run by cron I only get a 20 byte
        >>file where the compressed image should be... does anyone have any idea
        >>as to why this might be happening? Code follows
        >>>
        >><code>
        >>>
        >>#!/usr/bin/python
        >>>
        >>from subprocess import PIPE, Popen
        >>from ftplib import FTP
        >>>
        >>host = 'box'
        >>>
        >>filename = '%s.img.gz' % host
        >>ftp_host = '192.168.1.250'
        >>ftpuser, ftppass = 'admin', 'admin'
        >>dest_dir = '/share/%s' % host
        >>>
        >>dump = Popen('dump 0uaf - /',shell=True,st dout=PIPE)
        You should avoid the use of ``shell=True`` here and use a argument list
        instead:

        dump = Popen(['dump', '0uaf', '-', '/'], stdout=PIPE)

        This results in an exception thrown if the executable doesn't exist. This
        exception can be caught and handle for instance with the logging module.
        >>gzip = Popen('gzip',sh ell=True,stdin= dump.stdout,std out=PIPE)
        Same here, but why don't you use the gzip functionality from the standard
        library?

        --
        Freedom is always the freedom of dissenters.
        (Rosa Luxemburg)

        Comment

        • Aidan

          #5
          Re: Python, subprocess, dump, gzip and Cron

          Sebastian "lunar" Wiesner wrote:
          Aidan <aweraw@gmail.c omat Dienstag 10 Juni 2008 07:21:
          >
          >TT wrote:
          >>On Jun 10, 2:37 pm, Aidan <awe...@gmail.c omwrote:
          >>>Hi,
          >>>>
          >>>I'm having a bit of trouble with a python script I wrote, though I'm not
          >>>sure if it's related directly to python, or one of the other software
          >>>packages.. .
          >>>>
          >>>The situation is that I'm trying to create a system backup script that
          >>>creates an image of the system, filters the output though gzip, and then
          >>>uploads the data (via ftp) to a remote site.
          >>>>
          >>>The problem is that when I run the script from the command line, it
          >>>works as I expect it, but when it is run by cron I only get a 20 byte
          >>>file where the compressed image should be... does anyone have any idea
          >>>as to why this might be happening? Code follows
          >>>>
          >>><code>
          >>>>
          >>>#!/usr/bin/python
          >>>>
          >>>from subprocess import PIPE, Popen
          >>>from ftplib import FTP
          >>>>
          >>>host = 'box'
          >>>>
          >>>filename = '%s.img.gz' % host
          >>>ftp_host = '192.168.1.250'
          >>>ftpuser, ftppass = 'admin', 'admin'
          >>>dest_dir = '/share/%s' % host
          >>>>
          >>>dump = Popen('dump 0uaf - /',shell=True,st dout=PIPE)
          You should avoid the use of ``shell=True`` here and use a argument list
          instead:
          >
          dump = Popen(['dump', '0uaf', '-', '/'], stdout=PIPE)
          >
          This results in an exception thrown if the executable doesn't exist. This
          exception can be caught and handle for instance with the logging module.
          >
          thanks. That exception certainly would have helped me...
          >>>gzip = Popen('gzip',sh ell=True,stdin= dump.stdout,std out=PIPE)
          >
          Same here, but why don't you use the gzip functionality from the standard
          library?
          is there a way I can create a gzip file-like object which can read the
          output from the dump subprocess, and has a read method which outputs the
          compressed data, which will not write to disk first? With the above
          code python doesn't have to write the system image data to disk at all,
          which helps when there is not enough disk space to hold an intermediate
          image (at least, that is my understanding of it...).

          I had a look at the gzip module, but eventually just fell back to using
          the stdin and stdout of a gzip subprocess. I'd be interested to know
          how it could be done using the python standard lib though.

          Comment

          Working...