Debian

Debian - 使用 crontab 安排 SQL 查詢

  • February 14, 2022

我不想使用 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)是一個很好的開關,因為它永遠不會以互動方式暫停提示。

引用自:https://unix.stackexchange.com/questions/690622