私の Java プログラムは、ディレクトリの内容を再帰的に読み取ります。これはサンプル ツリーです (非 ASCII 文字に注意してください)。
./sviluppo
./sviluppo/ciaò
./sviluppo/ciaò/subdir
./sviluppo/pippo
./sviluppo/pippo/prova2.txt <-file
./sviluppo/così
プログラムは、次のような名前の構成ファイルを使用して、Upstart サービスとして開始されます。/init/myservice.conf
description "Private Service"
author "AD"
start on runlevel [2345]
stop on runlevel [! 2345]
exec java -jar /home/mainFind.jar >> /tmp/log.txt
サービスを起動すると:
root@mdr:/tmp# service myservice start
myservice start/running, process 15344
名前に非 ASCII 文字を含むファイル名はログに記録されません。
root@mdr:/tmp# cat /tmp/log.txt
Found dir: /mnt/sviluppo/pippo
代わりに、コマンドを実行すると (サービスとして開始されたときに何が起こるかを模倣するために、ルートとして)、次のコマンドの有無にかかわらず正常に動作しますexec
。
root@mdr:/tmp# java -jar /home/mainFind.jar >> /tmp/log.txt
root@mdr:/tmp# exec java -jar /home/mainFind.jar >> /tmp/log.txt
root@mdr:/tmp# cat /tmp/log.txt
Found dir: /mnt/sviluppo/ciaò
Found dir: /mnt/sviluppo/ciaò/subdir
Found dir: /mnt/sviluppo/pippo
Found dir: /mnt/sviluppo/così
同じユーザーが実行する同じプログラムが Upstart サービスでは機能しないのに、コマンド ラインから実行するとすべてのファイル名が正しく処理されるのはなぜですか? ここにJavaコードがあります
public static void aggiungiFileDir(File f){
File[] lista= f.listFiles();
for(int i=0;i<lista.length;i++){
if(lista[i].isDirectory()){
System.out.println("Found dir: "+lista[i]);
}
}
}
仮パラメータf
はルート ディレクトリです。この関数は、各サブディレクトリで再帰的に呼び出されます。
編集 2: ポスト ls
root@mdr:/tmp# ls -al /mnt/sviluppo
totale 20
drwx------ 5 root root 4096 nov 15 15:10 .
drwxr-xr-x 7 root root 4096 nov 9 10:43 ..
drwxr-xr-x 2 root root 4096 nov 15 15:10 ciaò
drwxr-xr-x 2 root root 4096 nov 15 11:23 così
drwxr-xr-x 2 root root 4096 nov 15 17:57 pippo