Debian - 使用 crontab 安排 SQL 查询

Debian - 使用 crontab 安排 SQL 查询

我不想使用 crontabSQL在数据库中安排查询。PostgreSQL

在终端中,在 root 中,当我运行时:

psql -U postgres -d my_database -h localhost -p 5432 -c "INSERT INTO schema.table (name) VALUES ('Insert with a command from terminal');"

它要求我输入密码。所以我添加它:

PGPASSWORD="mypassword" psql -U postgres -d my_database -h localhost -p 5432 -c "INSERT INTO schema.table (name) VALUES ('Insert with a command from terminal and password');"

当我在 crontab 中运行相同的命令时,它没有成功:

0 12 * * * PGPASSWORD="mypassword" psql -U postgres -d my_database -h localhost -p 5432 -c "INSERT INTO schema.table (name) VALUES ('Insert with a command from crontab and password');"

crontab 日志返回给我

nano var/log/syslog

(root) CMD (PGPASSWORD="mypassword" psql -U postgres -d my_database -h localhost -p 5432 -c "INSERT INTO schema.table (name) VALUES ('Insert with a command from crontab and password');")
CRON[15504]: (CRON) info (No MTA installed, discarding output)
CRON[15677]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
crontab[15862]: (root) BEGIN EDIT (root)
systemd[1]: session-60285.scope: Succeeded.
crontab[15862]: (root) END EDIT (root)

为什么 crontab 作业不执行 pgsql 命令?如何使用 crontab 安排 SQL 命令?

答案1

一些 cron 的实现(我想包括 Debian 自带的)可以让你在前几行设置环境变量:

PGPASSWORD="mypassword" 
0 12 * * * psql -U postgres -d my_database -h localhost -p 5432 -c "INSERT INTO schema.table (name) VALUES ('Insert with a command from crontab and password');"

这必须是一个 cron 作业吗?由于您运行的是 Debian,因此您可以使用 systemd 的计时器。

要在 systemd 中实现此功能,您需要编写一个用于调度作业的计时器单元和一个运行该作业的服务单元。服务单元可以设置环境变量。

#/etc/systemd/system/regularquery.timer
[Unit]
Description="Timer to run SQL query"
After=postgresql.service

[Timer]
OnCalendar=*-*-* 12:00:00
Unit=regularquery.service

[Install]
WantedBy=multi-user.target
#/etc/systemd/system/regularquery.service
[Unit]
Description="SQL Query

[Service]
Type=oneshot
User=postgres
Environment=PGPASSWORD="mypassword"
ExecStart=/usr/bin/psql -U postgres -d my_database -h localhost -p 5432 -c "INSERT INTO schema.table (name) VALUES ('Insert with a command from terminal');"

尝试一下sudo systemctl start regularquery.service,看看是否连接正常。您可以使用 监视输出journalctl -u regularquery.service。当你高兴的时候,把事情安排好sudo systemctl enable --now regularquery.timer


或者,我在以下位置找到了这个man psql

       -w
       --no-password
           Never issue a password prompt. If the server requires password
           authentication and a password is not available from other sources
           such as a .pgpass file, the connection attempt will fail. This
           option can be useful in batch jobs and scripts where no user is
           present to enter a password.

这表明这~/.pgpass可能是环境变量的一个很好的替代方案。它还表明--no-password对于非用户会话(即 crontab 或 systemd)来说这是一个很好的开关,因为它永远不会交互式地暂停提示。

相关内容