Ksh
發送 db2 命令時 su -c 命令失敗
我設置了一個腳本來執行許多任務,其中之一是在數據庫中設置一個表,然後將其刪除(用於自動化測試)。
問題在於,只有少數我使用該
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 - user
andsu - 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))'"