我有以下脚本来终止后端进程。
exec('psql -Upostgres -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
注意:由于procpid
列已替换为pid
在将数据库重置为早期状态之前,此脚本已运行。如果脚本无法运行,则重置数据库的下一个脚本也将失败并抛出错误,如
ERROR: column "procpid" does not exist
LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity w...
dropdb: database removal failed: ERROR: database "dbName" is being accessed by other users
DETAIL: There is 1 other session using the database.
createdb: database creation failed: ERROR: database "dbName" already exists
Looks like you failed 8 tests of 74.
所以,我想通过使用像
这样的PHP脚本来避免这种错误的方法exec('psql --version', $vout);
$isNewVersion = false;
if ($vout !== false)
{
$x = preg_match_all('!\d+!', $vout[0], $mcs);
if ($x !== false && $x > 0) {
$v = implode('', $mcs[0]);
}
// Check if psql version is >= 9.3.10
$isNewVersion = (strpos($v, '931') !== false);
}
if ($isNewVersion)
{
exec('psql -Upostgres -c "select pg_terminate_backend(pid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
}
else
{
exec('psql -Upostgres -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
}
问题是,我认为我的代码不可读或友好,因为我只是在unit testing
中使用它。
所以,我想知道是否有另一种替代方法可以终止与任何版本的postgres(8.3或更高版本)兼容的后端
任何建议表示赞赏。我是postgres btw的新手。
答案 0 :(得分:2)
新旧格式enddate=2/10/2016
进程ID位于第三列,
所以你可以使用这个查询得到它:
pg_stat_activity