PostgreSQL作业调度代理pgAgent安装及配置

pgAgent是PostgreSQL的作业调度代理。

安装pgAgent

apt-get install pgagent

安装pgAgent数据库

pgAgent需要一些数据库表和其他对象的支持,因此需要先安装pgAgent数据库。pgagen包中已经包含了创建pgAgent数据库的脚本,有两个文件,分别是:

1
2
/usr/share/pgadmin3/pgagent.sql
/usr/share/pgadmin3/pgagent_upgrade.sql

以数据库管理员身份连接到系统数据库postgres,分别执行这两个脚本,会创建一个新的schema pgagent。pgagent的详细参数见man pgagent。

pgagent需要一个标准的postgresql连接字符串连接到数据库,比如:

1
/path/to/pgagent hostaddr=localhost dbname=postgres user=postgres

因为安全原因,不能直接将密码写入连接字符串,因为那样任何人使用ps命令就可以看到密码。所以使用~/.pgpass文件为数据库用户提供密码。

创建pgagent用户和.pgpass文件

pgAgent将以pgagent用户的身份运行,因此首先创建pgagent用户

1
# adduser --shell=/bin/bash pgagent

然后在pgagent用户的主目录下新建.pgpass文件

1
2
#hostname:port:database:username:password
*:*:*:postgres:postgres

将.pgpass的访问权限设置为0600

1
$ chmod 0600 .pgpass

有一点儿应该注意,用户pgagent连接数据库时的用户必须支持使用MD5密码认证才行,具体详见pg_hba.conf配置。

pgAgent init script

/usr/bin/pgagent需要作为守护程序运行,它会周期性的查询postgresql数据库,然后执行用户设定的jobs。
pgagent包并没有带init脚本,因此写了下面的init脚本,使pgagent可以作为Daemon程序自动运行。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/bin/bash
set -e

#
# Starts / stops the pgagent daemon
#
# /etc/init.d/pgagent

### BEGIN INIT INFO
# Provides: pgagent
# Required-Start:$local_fs $remote_fs $network $time postgresql
# Required-Stop:$local_fs $remote_fs $network $time
# Should-Start:$syslog
# Should-Stop:$syslog
# Default-Start:2 3 4 5
# Default-Stop:0 1 6
# Short-Description:pgagent Postgresql Job Service
### END INIT INFO

# For SELinux we need to use 'runuser' not 'su'
if \[ -x /sbin/runuser \]
then
SU=runuser
else
SU=su
fi

DBNAME=${DBNAME-postgres}
DBUSER=${DBUSER-postgres}
DBHOST=${DBHOST-localhost}
DBPORT=${DBPORT-5432}
LOGFILE=${LOGFILE-/var/log/pgagent.log}
pidfile="/var/run/pgagent.pid"

RETVAL=0
NAME="pgagent"
PROG="/usr/bin/pgagent"

# Override defaults from /etc/default/pgagent file,if file is present:
\[ -f /etc/default/pgagent \] && . /etc/default/pgagent

echo_success() {
echo "Success."
}
echo_failure() {
echo "Failure."
}

start() {
# Make sure that pgagent is not already running:
if \[ -e "${pidfile}" \]
then
echo "${NAME} is already running"
exit 0
fi

echo "Starting ${NAME} service... "

if \[ ! -e "${LOGFILE}" \]; then
touch ${LOGFILE}
chown root:pgagent ${LOGFILE}
chmod g+rw ${LOGFILE}
fi

$SU - pgagent -c "$PROG -s $LOGFILE hostaddr=$DBHOST dbname=$DBNAME user=$DBUSER"
RETVAL=$?
if \[ $RETVAL -eq 0 \]
then
echo_success
touch $pidfile
echo \`pidof pgagent\` > $pidfile
else
echo_failure
return -1
fi
}

stop(){
echo $"Stopping ${NAME} service... "

if \[ ! -e "$pidfile" \]; then
echo "${NAME} is not running."
exit 0
else
pid=\`cat $pidfile\`
kill $pid true
rm $pidfile
echo_success
return 0
fi
}

status() {
if \[ ! -f "${pidfile}" \]; then
echo "${NAME} is not running."
else
echo "${NAME} is running."
fi
}

#
case "$1" in
start)
start
;;
stop)
stop
;;
reloadrestart)
stop
start
;;
status)
status
;;
*)
echo $"Usage: $0 {startstoprestartreloadstatus}"
esac

exit $?

使用这个脚本需要新建pgagent用户来运行daemon程序,并且要在pgagent的用户主目录下添加.pgpass文件。

如需要更改pgagent运行时的选项,在/etc/default/pgagent文件添加选项,覆盖默认值即可。

在各个运行级对应的启动脚本目录下创建符号连接

1
# update-rc.d pgagent defaults

References:
[1]pgAgent
[2]RHEL5为postgresql安装独立作业插件:pgAgent手记

===
[erq]