Ksh

發送 db2 命令時 su -c 命令失敗

  • April 27, 2016

我設置了一個腳本來執行許多任務,其中之一是在數據庫中設置一個表,然後將其刪除(用於自動化測試)。

問題在於,只有少數我使用該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 外殼。

我有一個似乎可行的解決方法。

我創建了一個單獨的 ksh 腳本,它執行所有 db2 命令(建立連接,然後創建一個表並授予其權限),並使用所需的任何參數執行它。

這意味著它在一個 su 實例中執行一組命令,儘管使用了 -c 部分,以便在腳本中有效地執行它。

問題是命令執行的環境使用su - userandsu - 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))'"

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