<!-- language-all: lang-py -->
I suppose your question does not include change detection, as your sample only concerns QgsMapCanvas.refresh()

Instead you have to call [QgsRasterLayer.triggerRepaint()][1]

If your layer is called myLayer:

    myLayer.setCacheImage( None )
    myLayer.triggerRepaint()

The same method exists for vector layers as well.

For low overhead file change notification I'd propose looking into Qt's [QFileSystemWatcher][2], which makes use of [inotify][3] on linux and [similar techniques][6] on [other][5] [platforms][4].

    from PyQt4.QtCore import QFileSystemWatcher

    def refreshLayer():
        myLayer.setCacheImage( None )
        myLayer.triggerRepaint()
    
    watcher = QFileSystemWatcher()
    watcher.addPath( '/path/to/your/raster' )
    watcher.fileChanged.connect( refreshLayer )


Of course this can be combined with an MD5 check as proposed by nickves.


  [1]: http://www.qgis.org/api/classQgsRasterLayer.html#ad2fabc4fdc3bce56d615b5513767eaa9
  [2]: http://qt-project.org/doc/qt-4.8/qfilesystemwatcher.html#details
  [3]: http://en.wikipedia.org/wiki/Inotify
  [4]: http://en.wikipedia.org/wiki/Kqueue
  [5]: https://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/FSEvents_ProgGuide/Introduction/Introduction.html
  [6]: http://msdn.microsoft.com/de-ch/library/windows/desktop/aa364417%28v=vs.85%29.aspx