Suponho que sua pergunta não inclua detecção de alterações, pois sua amostra se refere apenas a QgsMapCanvas.refresh()
Em vez disso, você deve ligar QgsRasterLayer.triggerRepaint()
Se sua camada for chamada myLayer:
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
O mesmo método existe também para as camadas vetoriais.
Para baixa notificação de alteração de arquivo de sobrecarga, proponho olhar para os Qt's QFileSystemWatcher, que usam o inotify no linux e técnicas semelhantes em outras plataformas .
from PyQt4.QtCore import QFileSystemWatcher
def refreshLayer():
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
watcher = QFileSystemWatcher()
watcher.addPath( '/path/to/your/raster' )
watcher.fileChanged.connect( refreshLayer )
Obviamente, isso pode ser combinado com uma verificação MD5, conforme proposto por nickves, ou com uma verificação de tempo de modificação com os.stat(proposta de Nathan W).