¿Cómo extraer pg_backend_pid de postgresql en el script de shell y pasarlo a otro proceso?

Necesito ejecutar bin/psql en la línea de comando (o script) e imprimir su pg_backend_pid , para que el pg_backend_pid pueda pasar a otro proceso (ejecutado por root) como argumento de línea de comando. El problema para mí es que el otro proceso debe ejecutarse después de obtener el pid. El psql (con la misma sesión pid) luego ejecuta una consulta después de que el otro proceso haya comenzado.

El truco es que Psql necesita esperar hasta que el otro proceso obtenga el pg_backend_pid y tenga que seguir siendo la misma sesión.

¿Se puede hacer esto a través de shell script o perl?

Querrá usar un coproceso en bash, o en perl con algún tipo de tubería bidireccional. En Python puede usar el comando os.popen2; perl también tiene instalaciones para interactuar con subprocesos sobre tuberías . Sin embargo, es mucho mejor usar controladores de base de datos de lenguaje nativo como DBD::Pg o psycopg2 si es posible.

Si debe hacer esto en el shell, consulte “info bash” y busque “coprocess”.

Aquí hay un script demo bash bash para que comiences.

 #!/bin/bash set -e -u DBNAME=whatever_my_db_is_called coproc psql --quiet --no-align --no-readline --tuples-only -P footer=off --no-password "$DBNAME" echo 'SELECT pg_backend_pid();' >&${COPROC[1]} read -u ${COPROC[0]} backend_pid echo "Backend PID is: ${backend_pid}" echo "SELECT random();" >&${COPROC[1]} read -u ${COPROC[0]} randnum echo "\q" >&${COPROC[1]} wait %1 echo "Random number ${randnum} generated by pg backend ${backend_pid}" 

Los argumentos para psql son para garantizar que no pause la entrada, no interprete tabs o metacaracteres como comandos de lectura, y no imprime bastante, por lo que es más fácil interactuar en el shell.

Alternativamente, es posible que realmente no necesite psql, solo necesita hablar con el servidor PostgreSQL a través de algún tipo de script. Si ese es el caso, será MUCHO más fácil usar un lenguaje de scripting con una interfaz de base de datos PostgreSQL. En Python, por ejemplo:

 #!/usr/bin/env python import os import sys import psycopg2 def main(): conn = psycopg2.connect("dbname=classads") curs = conn.cursor() curs.execute("SELECT pg_backend_pid();"); pid = curs.fetchall()[0][0] # Do whatever you need to here, # like using os.system() or os.popen() or os.popen2() to talk to # system commands, using curs.execute() to talk to the database, etc. conn.close(); if __name__ == '__main__': main() 

En Perl puede usar DBI y DBD :: Pg para lograr un efecto similar.