web-dev-qa-db-fra.com

pg_ctl blasse sur ssh

Je concevons un processus pour tester mes sauvegardes de PostgreSQL 10.8 en les restant à un point aléatoire dans une machine virtuelle jetable. Je n'ai pas été incapable d'automatiser complètement le processus cependant. Je suis bloqué à l'étape 8 (article 25.3.4) de la documentation officielle

  1. Démarrer le serveur.

Lors de l'exécution du pg_ctl start Sur SSH, la commande se bloque jusqu'à ce qu'il soit tué. Si je suis directement sur le VM et exécutez pg_ctl start, alors la commande retourne rapidement comme prévu.

Ce fil de 2012 semble décrire un scénario similaire. Dans mon cas, cependant le processus Postgres le fait Commencez avec succès même si la session d'appel est tuée alors qu'elle est suspendue (éventuellement une amélioration entre 9.0.5 et 10,8 cependant?).

Ce problème GitHub semble pertinent mais malheureusement est "résolu" par une longue réécriture dans une langue que je ne connais pas et conclut enfin que c'est un bug dans le pg_ctl binaire.

La grande question

Comment puis-je automatiser l'étape 8 afin que je puisse continuer à des tests de validation ultérieurs de mes médias de sauvegarde?

Est-ce un bogue exceptionnel dans le binaire, j'ai besoin de pirater? Ou avez-je raté une implémentation raisonnable?

5
Peter Vandivier

Il ressemble à pg_ctl veut un vrai terminal pour la sortie, qui n'est pas attribué par ssh lorsque vous le demandez simplement d'exécuter une commande. Selon le Manuel Postgres

Sur les systèmes de type Unix, par défaut, la sortie standard du serveur et l'erreur standard sont envoyées à la sortie standard de PG_CTL (pas d'erreur standard). La sortie standard de PG_CTL devrait ensuite être redirigée vers un fichier ou une canalisée à un autre processus tel qu'un programme rotatif de journal comme des rotatelogs; Sinon postgres _ _ ¡_ ecriera sa sortie sur le terminal de contrôle (de l'arrière-plan) et ne quittera pas le groupe de processus de la coque. [...] Ces comportements par défaut peuvent être modifiés en utilisant -l pour ajouter la sortie du serveur dans un fichier journal. L'utilisation de -l ou de la redirection de sortie est recommandée.

Par conséquent, vous devez soit dire que vous devez dire ssh d'allouer une borne pour pg_ctl à l'aide des options -t (ssh -t somehost "pg_ctl start") ou dites pg_ctl to pas Écrire sur le terminal (ssh somehost "pg_ctl start >/dev/null" ou ssh somehost "pg_ctl start -l /tmp/start.log ")

6
mustaccio