diff --git a/qt/app.py b/qt/app.py index ebc8ae6b7..72999d887 100644 --- a/qt/app.py +++ b/qt/app.py @@ -484,11 +484,11 @@ def _create_actions(self): _('Use checksums for file change detection.')), 'act_pause_take_snapshot': ( icon.PAUSE, _('Pause backup process'), - lambda: os.kill(self.snapshots.pid(), signal.SIGSTOP), None, + lambda: self._signal_snapshot_process(signal.SIGSTOP), None, None), 'act_resume_take_snapshot': ( icon.RESUME, _('Resume backup process'), - lambda: os.kill(self.snapshots.pid(), signal.SIGCONT), None, + lambda: self._signal_snapshot_process(signal.SIGCONT), None, None), 'act_stop_take_snapshot': ( icon.STOP, _('Stop backup process'), @@ -1871,12 +1871,30 @@ def _create_backup(self, checksum: bool) -> None: backintime.takeSnapshotAsync(self.config, checksum=checksum) self._update_backup_status(True) + def _signal_snapshot_process(self, sig: signal.Signals) -> bool: + pid = self.snapshots.pid() + + if not tools.processAlive(pid): + self._update_backup_status(True) + return False + + try: + os.kill(pid, sig) + except ProcessLookupError: + logger.debug( + f'Ignoring signal {sig} for vanished snapshot process {pid}.') + self._update_backup_status(True) + return False + + return True + def _slot_backup_stop(self): - os.kill(self.snapshots.pid(), signal.SIGKILL) + if self._signal_snapshot_process(signal.SIGKILL): + self.snapshots.setTakeSnapshotMessage(0, 'Backup terminated') + self.act_stop_take_snapshot.setEnabled(False) self.act_pause_take_snapshot.setEnabled(False) self.act_resume_take_snapshot.setEnabled(False) - self.snapshots.setTakeSnapshotMessage(0, 'Backup terminated') # |---------| # | Restore |