2016-09-27 118 views
1

我在這裏得到這樣一個奇怪的行爲。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 =========

問題解決了,未來的讀者可以參考下面的評論。

+1

你是否從同一個用戶(java程序和直接ksh腳本)執行它?如果沒有提供-u選項,crontab在當前用戶條目上運行 –

+0

這可能是一個很好的提示。關於-u,我不能使用它,因爲:「必須有特權才能使用-u」。我無法以超級用戶身份執行它。但是應該有辦法強制java用某個用戶來執行,不是嗎? –

+1

將whoami> /tmp/java_whoami.txt添加到您的ksh,並檢查文件/tmp/java_whoami.txt,如果用戶是您期望的用戶 –

回答

2

執行的crontab -l沒有-u選項將只列出當前用戶的crontab條目。

的解決方案是與-u參數指向實際的用戶:

echo "$(crontab -u myuser -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)" 

第二種解決方案是從用戶添加運行Java程序的用戶的所有crantab條目和刪除條目不需要它們。

0

Java與用戶運行我沒有料到。繼@Piotr [R建議,我解決了這個由目前的crontab -l命令加入-u參數:

echo "$(crontab -u myuser -l | grep ism | grep -v '#' | cut -d ' ' -f 6 | cut -d '/' -f 5)"