Debian
Debian - 使用 crontab 安排 SQL 查詢
我不想使用 crontab 在數據庫中安排
SQL
查詢。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 命令?
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)是一個很好的開關,因為它永遠不會以互動方式暫停提示。