複数のタスクを実行するように設定されたスクリプトがあり、そのうちの1つはデータベースにテーブルを設定してから削除することです(自動テスト用)。
問題は、少数のユーザーだけがこのsu - user -c
コマンドを使用し、db2への呼び出しが失敗することです。しかし、奇妙なことに、su - user
db2コマンドを使用して実行すると(スクリプトの外側で)うまくいきます。この問題は、スクリプトを一度実行した後にスクリプトが実行されている間にのみ発生します。 (いかなる方法でも変更が発生することはわかりませんが、残念ながら正確なコードを共有することはできません。はい/役に立つと面白いでしょう。ここでは、いくつかの基本ループとsu - user -c
IBM mqコマンドを呼び出す一連のコマンドのみ含まれています。
たとえば、次は失敗します。
su - user -c "db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"
間違い:
DB21016E The Command Line Processor encountered a system error while sending the command to the backend process.
DB21018E A system error occurred. The command line processor could not continue processing.
しかし、これはうまくいきます。
su - user
db2 connect to database USER user USING pass
db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'
違いがあるかどうかを確認するために、両方のケースでenvコマンドを出力してみましたが、期待どおりに機能しました。また、他のユーザーが実行する順序を調整してみましたが、それも役に立たないようです。
本当に混乱しています。助けてくれてありがとう。
kshシェルを使用しています。
答え1
うまくいくような解決策があります。
別々のkshスクリプトを生成し、すべてのdb2コマンドを実行し(接続を確立してからテーブルを作成し、それを許可する)、必要なパラメーターを使用してスクリプトを実行しました。
これは、-c部分にもかかわらず、suインスタンス内で一連のコマンドを実行してスクリプト内で効果的に実行することを意味します。
答え2
su - user
問題は、コマンドが使用され実行される環境がsu - user -c
異なる場合があり、正常に機能するには欠落しているdb2
変数(設定など)が必要であることです。DB2INSTANCE
出力比較:
$ su - user
# printenv
そして
$ su - user -c printenv
その後、以下のように欠落している変数を簡単に渡すことができます。
$ su - user -c "export DB2INSTANCE=inst ; db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"