Barman 3.15 recover --remote-ssh-command returns "EXCEPTION: Unable to create write check file"

13 views
Skip to first unread message

Stan

unread,
Sep 16, 2025, 7:26:22 AM (3 days ago) Sep 16
to Barman, Backup and Recovery Manager for PostgreSQL
Hello,

We just upgraded our Barman v3.13 setup to v3.15 and now are no longer able to recover a backup over SSH.

I have double checked the privileges on the destination computer, and everything seems to be in order. I can connect over SSH and read/write/remove files in the destination folder. I am also able to use the "recover" command locally, but if I specify the "--remote-ssh-command" option, barman returns "EXCEPTION: Unable to create write check file".

Here is the full command and response from the terminal:

barman recover --remote-ssh-command 'ssh post...@192.163.1.36 -p 49166' pg_live 20250916T040109 /Users/Shared/dump

Processing xlog segments from streaming for pg_live (batch size: 9)
00000001000008690000006F
000000010000086900000070
000000010000086900000071
000000010000086900000072
000000010000086900000073
000000010000086900000074
000000010000086900000075
000000010000086900000076
000000010000086900000077
Processing xlog segments from file archival for pg_live
00000001000008690000006F
000000010000086900000070
000000010000086900000071
000000010000086900000072
000000010000086900000073
000000010000086900000074
000000010000086900000075
000000010000086900000076
000000010000086900000077
Starting remote restore for server pg_live using backup 20250916T040109
Destination directory: /Users/Shared/dump
Remote command: ssh post...@192.163.1.36 -p 49166
Copying the base backup.
EXCEPTION: Unable to create write check file
See log file for more details.



Barman is running on a Mac mini M1 with macOS Sequoia (15.3.1). The destination computer is also a Mac, running macOS 15.7.

Any idea what is wrong here? Below is the complete Barman log.

Kind regards,

Stan

--------------------------------------------------
2025-09-16 13:09:53,419 [89303] barman.wal_archiver INFO: Found 10 xlog segments from streaming for pg_live. Archive a batch of 9 segments in this run.
2025-09-16 13:09:53,420 [89303] barman.wal_archiver INFO: Archiving segment 1 of 9 from streaming: pg_live/00000001000008690000006F
2025-09-16 13:09:53,421 [89303] barman.wal_archiver INFO: Archiving segment 2 of 9 from streaming: pg_live/000000010000086900000070
2025-09-16 13:09:53,421 [89303] barman.wal_archiver INFO: Archiving segment 3 of 9 from streaming: pg_live/000000010000086900000071
2025-09-16 13:09:53,422 [89303] barman.wal_archiver INFO: Archiving segment 4 of 9 from streaming: pg_live/000000010000086900000072
2025-09-16 13:09:53,423 [89303] barman.wal_archiver INFO: Archiving segment 5 of 9 from streaming: pg_live/000000010000086900000073
2025-09-16 13:09:53,423 [89303] barman.wal_archiver INFO: Archiving segment 6 of 9 from streaming: pg_live/000000010000086900000074
2025-09-16 13:09:53,424 [89303] barman.wal_archiver INFO: Archiving segment 7 of 9 from streaming: pg_live/000000010000086900000075
2025-09-16 13:09:53,424 [89303] barman.wal_archiver INFO: Archiving segment 8 of 9 from streaming: pg_live/000000010000086900000076
2025-09-16 13:09:53,425 [89303] barman.wal_archiver INFO: Archiving segment 9 of 9 from streaming: pg_live/000000010000086900000077
2025-09-16 13:09:53,426 [89303] barman.wal_archiver INFO: Found 9 xlog segments from file archival for pg_live. Archive all segments in one run.
2025-09-16 13:09:53,426 [89303] barman.wal_archiver INFO: Archiving segment 1 of 9 from file archival: pg_live/00000001000008690000006F
2025-09-16 13:09:53,432 [89303] barman.wal_archiver INFO: Archiving segment 2 of 9 from file archival: pg_live/000000010000086900000070
2025-09-16 13:09:53,436 [89303] barman.wal_archiver INFO: Archiving segment 3 of 9 from file archival: pg_live/000000010000086900000071
2025-09-16 13:09:53,440 [89303] barman.wal_archiver INFO: Archiving segment 4 of 9 from file archival: pg_live/000000010000086900000072
2025-09-16 13:09:53,444 [89303] barman.wal_archiver INFO: Archiving segment 5 of 9 from file archival: pg_live/000000010000086900000073
2025-09-16 13:09:53,448 [89303] barman.wal_archiver INFO: Archiving segment 6 of 9 from file archival: pg_live/000000010000086900000074
2025-09-16 13:09:53,453 [89303] barman.wal_archiver INFO: Archiving segment 7 of 9 from file archival: pg_live/000000010000086900000075
2025-09-16 13:09:53,457 [89303] barman.wal_archiver INFO: Archiving segment 8 of 9 from file archival: pg_live/000000010000086900000076
2025-09-16 13:09:53,461 [89303] barman.wal_archiver INFO: Archiving segment 9 of 9 from file archival: pg_live/000000010000086900000077
2025-09-16 13:09:54,179 [89303] barman.recovery_executor INFO: Starting remote restore for server pg_live using backup 20250916T040109
2025-09-16 13:09:54,180 [89303] barman.recovery_executor INFO: Destination directory: /Users/Shared/dump
2025-09-16 13:09:54,181 [89303] barman.recovery_executor INFO: Remote command: ssh post...@192.163.1.36 -p 49166
2025-09-16 13:09:54,420 [89303] barman.recovery_executor WARNING: Unable to retrieve safe horizon time for smart rsync copy: The /Users/Shared/dump/.barman-recover.info file does not exist
2025-09-16 13:09:54,421 [89303] barman.recovery_executor INFO: Copying the base backup.
2025-09-16 13:09:56,235 [89303] Command WARNING: zsh:1: command not found: touch
2025-09-16 13:09:56,237 [89303] barman.cli ERROR: Unable to create write check file
See log file for more details.
Traceback (most recent call last):
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/cli.py", line 2673, in main
    args.func(args)
    ~~~~~~~~~^^^^^^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/cli.py", line 1302, in restore
    server.recover(
    ~~~~~~~~~~~~~~^
        backup_info,
        ^^^^^^^^^^^^
    ...<14 lines>...
        **snapshot_kwargs,
        ^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/server.py", line 2330, in recover
    return self.backup_manager.recover(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        backup_info, dest, wal_dest, tablespaces, remote_command, **kwargs
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/backup.py", line 1155, in recover
    recovery_info = executor.recover(
        backup_info,
    ...<4 lines>...
        **kwargs
    )
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 204, in recover
    self._backup_copy(
    ~~~~~~~~~~~~~~~~~^
        backup_info,
        ^^^^^^^^^^^^
    ...<4 lines>...
        recovery_info=recovery_info,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 3228, in _backup_copy
    backup_info = operation.execute(
        backup_info=backup_info,
    ...<5 lines>...
        is_last_operation=is_last_operation,
    )
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 1822, in execute
    return self._execute(
           ~~~~~~~~~~~~~^
        backup_info,
        ^^^^^^^^^^^^
    ...<5 lines>...
        is_last_operation,
        ^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 2270, in _execute
    return self._execute_on_chain(
           ~~~~~~~~~~~~~~~~~~~~~~^
        backup_info,
        ^^^^^^^^^^^^
    ...<5 lines>...
        is_last_operation,
        ^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 1925, in _execute_on_chain
    volatile_backup = method(backup, destination, *args, **kwargs)
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 2338, in _rsync_backup_copy
    self._copy_pgdata_and_tablespaces(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        backup_info, controller, dest_prefix, destination, tablespaces
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 2464, in _copy_pgdata_and_tablespaces
    self._prepare_directory(_dir)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/recovery_executor.py", line 2053, in _prepare_directory
    self.cmd.check_write_permission(dest_dir)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/opt/macports-bin-pkg-version/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/barman/fs.py", line 228, in check_write_permission
    raise FsOperationFailed("Unable to create write check file")
barman.exceptions.FsOperationFailed: Unable to create write check file

Gustavo Oliveira

unread,
Sep 16, 2025, 12:31:34 PM (3 days ago) Sep 16
to Barman, Backup and Recovery Manager for PostgreSQL
Hey!

There's a line in the logs about `touch` not being available:

2025-09-16 13:09:56,235 [89303] Command WARNING: zsh:1: command not found: touch

Can you check for the availability of `touch` in the destination host and if everything is OK with your `PATH`?

Stan

unread,
Sep 17, 2025, 4:58:48 AM (3 days ago) Sep 17
to Barman, Backup and Recovery Manager for PostgreSQL
Hi Gustavo,

That was indeed the problem. By updating /etc/ssh/sshd_config on the client to include "/usr/bin" in the PATH environment variable, the remote recovery is working again.

Thanks!

Stan
Reply all
Reply to author
Forward
0 new messages