I suppose your question does not include change detection, as your sample only concerns QgsMapCanvas.refresh()
Instead you have to call QgsRasterLayer.triggerRepaint()
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, which makes use of inotify on linux and similar techniques on other platforms.
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.