質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

8822閲覧

cronで実行postgresqlのストアド実行について

dthani

総合スコア131

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2015/10/30 01:23

編集2015/10/30 02:48

cronで、postgresqlのストアドファンクションを実行する際に2点わからない点が
あるのですが、ご存知の方、ご教授ください。

1.下記、シェルをcronで実行すると、5分毎にログは作成されるのですが、処理は最初の一回しか実行されません。5分毎に実行させたいのですが、どうすればよろしいでしょうか?
クーロンを使用せずに、./5time.shで実行したときに、-bash-4.1$となって、exitを入力すると下記のように
エラーを出すのですが、これが問題なのでしょうか?対処方法を教えてください。

-bash-4.1$ exit
logout
psql: FATAL: ロール"root"は存在しません
psql: FATAL: ロール"root"は存在しません
psql: FATAL: ロール"root"は存在しません
psql: FATAL: ロール"root"は存在しません

クーロン

*/5 * * * * /root/batch/5time.sh

シェル(5time.sh)

#!/bin/sh DT=`date "+%Y%m%d"` NW=`date "+%Y/%m/%d-%H:%M:%S"` LOG_DIR=/tmp echo ${NW} "start:update_fnc" >> ${LOG_DIR}/${DT}_update_fnc.log sudo -u postgres psql testDB -c "select test.update_fnc1(now());" sudo -u postgres psql testDB -c "select test.update_fnc2(now());" sudo -u postgres psql testDB -c "select test.update_fnc3(now());" sudo -u postgres psql testDB -c "select test.update_fnc4(now());" echo ${NW} "end:update_fnc" >> ${LOG_DIR}/${DT}_update_fnc.log exit

2.シェルでストアドファンクション(select test.update_fnc(now());)を実行したときの戻り値を取得するには、どうしたらよいでしょうか?
下記の書き方しかわかりませんので、ご教授ください。

sudo -u postgres psql testDB -c "select test.update_fnc1(now());"

実行環境 CentOS6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

横から失礼します。

ファンクションが実行されない、とのことですが、実際には実行されているけど、cron実行時には標準出力が見えないため実行されていないように見えるだけかもしれません。

sudo でファンクション実行している行の行末にログファイルへのリダイレクトを入れると期待した動作になりませんか?

投稿2015/10/30 08:52

takyafumin

総合スコア2335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/10/30 09:10

ご回答ありがとうございます。 データを確認しましたが、実際、実行されていません。 ログファイルのリダイレクトですが、下記みたいな感じでよいですか? sudo -u postgres psql testDB -c "select test.update_fnc1(now());" >> aaa.log
takyafumin

2015/10/30 09:18

2.シェルでストアドファンクション(select test.update_fnc(now());)を実行したときの戻り値を取得するには、どうしたらよいでしょうか? とあったので、参照のみのファンクションと早とちりしていました。 ファンクション実行後にcommitは行っていますでしょうか?commitされないとデータが確定しないかと思われます。 ログファイルへのリダイレクトは記載いただいたような記述で良いかと思います。
dthani

2015/10/30 09:43 編集

cronで実行する場合は、ストアドファンクションの中に、commitを入れるのでしょうか? シェルを手動実行したときは、反映されるので要らないと思っていたのですが。 オートコミットと思っていましたが。
takyafumin

2015/10/30 09:54

postgresqlでは、autocommit はデフォルトでonみたいですね。失礼いたしました。 commit の部分は無視していただけますか。 また、標準出力をログに出力した結果はいかがでしたか? もし状況の切り分けをおこなうのであれば、ファンクション実行部分を単純なsql文に変更し、sqlの実行が行えるか確認をお願いします。 (psqlコマンドが実行できるか確認) sqlが実行出来れば、次は更新処理を行わないファンクションをテスト的に作成し、ファンクションの実行ができるかお試しください。 (psqlにてファンクションが実行できるか確認) ファンクション自体を提示いただければ、こちらでも検証してみたいと思います。
dthani

2015/10/30 12:20 編集

ご回答ありがとうございます。 sudo -u postgres psql testDB -c "select test.update_fnc1(now());" 1>> /tmp/s.log 2>> /tmp/e.log でログを見たところ、 sudo: sorry, you must have a tty to run sudo と出たので検索したころ、設定を色々といじらないといけないようだったので、 php側でストアドを実行する文を作成してcronに登録させて実行させるようにしました。
takyafumin

2015/10/30 13:07

はじめの形とは異なってしまいましたが、解決に至ってよかったです。 今後もがんばってください。
guest

0

psqlログインユーザの問題かと思います。
以下のコマンドでいかがでしょうか。

sudo -u postgres psql -U ユーザ名 testDB -c "select test.update_fnc1(now());"

投稿2015/10/30 03:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dthani

2015/10/30 05:16

ご回答ありがとうございます。 その設定をしたのですが、下記のエラーが出ます。 psql: FATAL: ユーザ "ユーザー名" で対向(peer)認証に失敗しました
dthani

2015/10/30 05:59 編集

1の件、root以外にシェルを置いたら、「psql: FATAL: ロール"root"は存在しません」というエラーが消えましたが、 cronで実行させると、ログは毎回出るのですが、ストアドファンクションの処理自体は1回しか実行しないです。
退会済みユーザー

退会済みユーザー

2015/10/30 06:22

> psql: FATAL: ユーザ "ユーザー名" で対向(peer)認証に失敗しました こちらの件は、該当ユーザで認証するのにパスワードが必要という内容です。 * ホームディレクトリに.pgpassを設定する * pg_hba.confを編集してlocalの認証設定をtrustに変更する のいずれかで解消できるかと思います。 > cronで実行させると、ログは毎回出るのですが、ストアドファンクションの処理自体は1回しか実行しないです。 2行目以降が実行されないということでしょうか? ログではend:update_funcが出力されている状況でしょうか?
dthani

2015/10/30 06:36 編集

ariakiさん、ご回答ありがとうございます。 1.下記のままで、シェル自体をtmpフォルダに持ってきてシェルの実行したところ、[root@サーバー名 tmp]#でエラーは出なくなりました。 sudo -u postgres psql testDB -c "select test.update_fnc1(now());" 2.cronで実行させたとき、ログでは、start:update_funcとend:update_funcは出力されますが、 ストアドファンクション自体は実行されませんでした。 */5 * * * * /tmp/5time.sh >「ストアドファンクションの処理自体は1回しか実行しないです。」は、手動で実行したのをcronで実行したのと勘違いしたと思います。つまり、cronで実行したときは、ストアドファンクションは一回も実行されなかったのではないかと思います。
退会済みユーザー

退会済みユーザー

2015/10/30 07:07

恐らくログイン権限の問題から実行失敗しているかと思うのですが、 原因をさぐる為にはログをご確認頂く必要があります。 cronからユーザ宛に何かエラーがメール通知されていませんか? もしくはcrontabにMAILTOを設定した場合になんらか受信されませんでしょうか?
dthani

2015/10/30 07:16

crontabには、mailtoを設定していません。(したことがありません。) すみませんが、どう書けばよいのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/30 09:47

crontabの先頭に MAILTO=hogehoge@address.jp を書けばエラー時にメール通知されるようになります。 以下に解説があります。 https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html 上記を設定されていない場合にはcronを登録したユーザ宛にメール通知がきますが、こちらは確認されましたか?
dthani

2015/10/30 12:21 編集

ご回答ありがとうございます。 先に、takyafuminさんの回答を見てログを出させたところ、 sudo: sorry, you must have a tty to run sudo と出たので検索したころ、設定を色々といじらないといけないようだったので、 php側でストアドを実行する文を作成してcronに登録させて実行させるようにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問