Моя программа 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
Когда я запускаю службу:
[email protected]:/tmp# service myservice start
myservice start/running, process 15344
он не записывает имена файлов с не-ASCII-символами в имени:
[email protected]:/tmp# cat /tmp/log.txt
Found dir: /mnt/sviluppo/pippo
Вместо этого, когда я запускаю команду (как root, чтобы имитировать то, что происходит, когда она запускается как служба), она отлично работает с и без exec
:
[email protected]:/tmp# java -jar /home/mainFind.jar >> /tmp/log.txt
[email protected]:/tmp# exec java -jar /home/mainFind.jar >> /tmp/log.txt
[email protected]:/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
является корнем dir. Функция будет называться рекурсивно на каждом поддире.
EDIT 2: Post ls
[email protected]:/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