2011-10-30 8 views
3

pg_backend_pidをコマンドライン引数として別のプロセス(ルートで実行)に渡せるように、コマンドライン(またはスクリプト)にbin/psqlを実行してpg_backend_pidを出力する必要があります。私の問題は、他のプロセスがpidを取得した後に実行する必要があることです。 psql(同じpidセッションを使用)は、他のプロセスが開始した後でクエリを実行します。シェルスクリプト内のpostgresqlからpg_backend_pidを追加して別のプロセスに渡すには?

トリックは、他のプロセスがpg_backend_pidになるまで待つ必要があり、同じセッションを維持する必要があるということです。

シェルスクリプトまたはperlでこれを行うことはできますか?

+0

実際に何をしようとしていますか? bin/psqlはperlスクリプトと何が関係していますか? – Flimzy

答えて

9

あなたはbashで、または何らかの二方向パイプでperlでコプロセッサを使いたいでしょう。 Pythonでは、os.popen2コマンドを使用できます。 perl also has facilities for interacting with subprocesses over pipes。しかし、のように、可能であれば、DBD::Pgまたはpsycopg2のような母国語のデータベースドライバを使用する方がよいでしょう。

シェルでこれを行う必要がある場合は、「info bash」を参照して「コプロセッサ」を検索してください。

ここでは、簡単にデモ用bashスクリプトを使用して始めます。

#!/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}" 

PSQLへの引数は、それが入力のために一時停止していないことを確認するために、readlineのコマンドとしてタブまたはmetacharsを解釈し、それがシェル上と対話する方が簡単ですので、ないきれいなプリント出力を行いますされませんされています。

psqlはまったく必要ないかもしれませんが、何らかのスクリプトを使ってPostgreSQLサーバと対話するだけでよいでしょう。そうであれば、PostgreSQLデータベースインターフェイスでスクリプト言語を使うだけで簡単に簡単に行えます。 Pythonでは、たとえば:

#!/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() 

Perlでは、同様の効果を得るためにDBIとDBD :: Pgを使用できます。

+0

+1非常に興味深い解決策です。 –

関連する問題