我在這裏得到這樣一個奇怪的行爲。Java不執行與Apache公共shellScript中的所有命令exec
我有以下方法:
public static void loadMonitorsFromCron(){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
File ism_dir = new File("/var/app/ism/");
String line = "/usr/bin/ksh /var/app/ism/ism_check_cron.ksh";
CommandLine commandLine = CommandLine.parse(line);
try {
DefaultExecutor exec = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
exec.setWorkingDirectory(ism_dir);
exec.setStreamHandler(streamHandler);
exec.execute(commandLine);
} catch (ExecuteException e1) {
System.out.println("ERROR: "+e1.getMessage());
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
System.out.println("ERROR: "+e1.getMessage());
// TODO Auto-generated catch block
e1.printStackTrace();
}
String[] paths = outputStream.toString().split("\n");
System.out.println("Paths: ");
for(int i=0;i<paths.length;i++)
System.out.println(paths[i]);
loadErrorCodeFromPath(paths);
}
這是腳本:ism_check_cron.ksh我試圖執行:
#!/usr/bin/ksh
echo "inbound_monitor.ksh"
echo "$(crontab -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)"
echo "ism_heapdump.ksh"
當我看從systemOut輸出,我剛纔看到這個:
SystemOut O Paths:
SystemOut O inbound_monitor.ksh
SystemOut O
SystemOut O ism_heapdump.ksh
crontab -l被列舉了許多其他字符串像上面那樣,但正如你所看到的,我沒有通過Java獲得任何東西。
如果我在Linux終端中執行腳本,它工作正常。由於Java可以執行腳本的「部分」,我還假定該方法也很好。所以我完全失去了。任何提示?
======== UPDATE =========
問題解決了,未來的讀者可以參考下面的評論。
你是否從同一個用戶(java程序和直接ksh腳本)執行它?如果沒有提供-u選項,crontab在當前用戶條目上運行 –
這可能是一個很好的提示。關於-u,我不能使用它,因爲:「必須有特權才能使用-u」。我無法以超級用戶身份執行它。但是應該有辦法強制java用某個用戶來執行,不是嗎? –
將whoami> /tmp/java_whoami.txt添加到您的ksh,並檢查文件/tmp/java_whoami.txt,如果用戶是您期望的用戶 –