我不想使用 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)来说这是一个很好的开关,因为它永远不会交互式地暂停提示。