作为 Upstart 服务启动时无法读取 UTF-8 文件名

2023-12-21

我的 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

相反,当我运行命令(以 root 身份运行,以模仿它作为服务启动时发生的情况)时,无论有没有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

Java 使用本机调用来列出目录的内容。底层 C 运行时依赖于locale构建 Java 的概念Strings 来自文件系统作为文件名存储的字节 blob。

当您从 shell(无论是作为特权用户还是非特权用户)执行 Java 程序时,它都会携带一个环境由变量组成。变量LANG被读取以将字节流转码为 Java 字符串,默认情况下,在 Ubuntu 上它与 UTF-8 编码相关联。

请注意,进程不需要从任何 shell 运行,但从代码来看,Upstart 似乎足够聪明,可以理解配置文件中的命令何时要从 shell 执行。因此,假设 JVM 是通过 shell 调用的,问题在于变量LANG未设置,因此 C 运行时采用默认字符集,这恰好是not beUTF-8。解决方案在 Upstart 节中:

description "List UTF-8 encoded filenames"
author "Raffaele Sgarro"
env LANG=en_US.UTF-8
script
  cd /workspace
  java -jar list.jar test > log.txt
end script

I used en_US.UTF-8作为语言环境,但任何支持 UTF-8 的语言环境都可以。测试的来源list.jar

public static void main(String[] args) {
    for (File file : new File(args[0]).listFiles()) {
        System.out.println(file.getName());
    }
}

目录/workspace/test包含文件名,例如ààà, èèè等等。现在您可以转到数据库部分;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作为 Upstart 服务启动时无法读取 UTF-8 文件名 的相关文章

随机推荐

  • 有没有为C#实现的图数据结构

    我试图找到一种在 C 中重用的图形数据结构 但没有成功 当然 我可以借用数据结构书籍 但我希望它更具商业实用性 如果您能告诉我实现图的最佳方法是什么 我将不胜感激 谢谢 快速图表 https github com YaccConstruct
  • GNU emacs 相当于 func-menu

    GNU emacs 是否有等效的 func menu 当我可以访问 xemacs 时 我使用了 func menu 并且与 speedbar 或 sr speedbar 相比 我更喜欢它的行为 具体来说 我喜欢只显示当前文件的功能 功能列表
  • 在程序包管理器控制台窗口中进入\退出 PowerShell 模式

    我想我不小心进入了 PowerShell 模式 所以目前我的控制台显示 PS gt c dev 我想知道如何退出 PS gt 模式并返回 PM 模式 我希望控制台窗口显示 PM gt 以便我可以安装软件包 这样的事情我也经历过 我尝试重新启
  • Spark的Column.isin函数不接受List

    我正在尝试从 Spark Dataframe 中过滤掉行 val sequence Seq 1 2 3 4 5 df filter df column isin sequence 不幸的是 我收到不支持的文字类型错误 java lang R
  • 在 python 中打印混淆矩阵的精度

    这是我的代码 from sklearn metrics import confusion matrix cm confusion matrix y test y pred 这就是我得到的 0 1 0 102 39 1 73 29 我怎样才能
  • IE10、IE11 中的跨浏览器 css 渐变

    我在所有浏览器中为深色按钮做了渐变 看起来不错 除了 IE10 IE11 版本 顶部和底部有浅色条纹 我通过 colorzilla 渐变编辑器生成渐变 链接到按钮 http buttons selcet com ua HTML div cl
  • Webpack 捆绑导致未知提供者 $injector/unpr 错误

    未知提供商 NavigationCtrl Restangular 我目前正在处理我的旧项目 让它们再次完全工作 作为一个小的重构练习 我遇到了一些不再编译的 AngularJS 代码 我相信这取决于更新的依赖项 因为我至少 3 年没有更改此
  • 实体框架在生成数据库时创建下划线列

    我有一个简单的对象模型如下 public class Product public long ProductId get set public int CategoryId get set public Category Category
  • Rails3 Google 地图使用 selenium 进行测试

    我正在尝试使用 Rails3 测试谷歌地图应用程序 我使用黄瓜与水豚和硒进行 JavaScript 测试 我有一张地图 等待谷歌地图加载 然后向我的服务器发送 ajax 请求 在服务器上我获取要插入地图中的位置 我想知道硒是否可以等待谷歌地
  • 验证一个整数并使其为 5 位数字

    我正在上我的第一堂 Java 课 我需要询问邮政编码 我知道如果他们不输入 5 位数字 如何要求新输入 但如果他们输入非整数 我该如何要求新输入 这是我所拥有的 import java util Scanner public class A
  • 将原语传递给 OCMock 的存根

    我正在学习如何使用 OCMock 来测试我的 iPhone 项目 我有这样的场景 一个带有getHeightAtX andY 方法和 Render 类使用HeightMap 我正在尝试使用一些单元测试渲染HeightMap嘲笑 这有效 id
  • jquery的promise方法到底是如何工作的?

    我真的不明白什么delegate and promise are 根据文档 delegate会将选择器和事件绑定到某种包装容器 该包装容器可以在以后再次用于当前和将来的项目 promise 如果新加载的所有内容都匹配 则会将事物重新映射回第
  • 如何在 Android 中正确地将像素坐标转换为画布坐标?

    我正在捕捉一个MotionEvent在 Android 设备上长按SurfaceView用一个GestureListener 然后我需要翻译的坐标MotionEvent到画布坐标 我可以从中生成自定义地图坐标 不是 Google 地图 根据
  • C# WebBrowser控件将网页保存为图像,重定向问题

    我在控制台应用程序中使用 Web 浏览器控件 它是以编程方式创建的 它通过一个 url 并使用 DrawToBitmap 将页面保存为图像文件 它似乎适用于许多网址 但不适用于某些网址 包括 www google co uk 它保存了一个空
  • 如何在 CoffeeScript 粗箭头回调中引用实际的“this”?

    标题说明了一切 当我在 CoffeeScript 中使用粗箭头时 它会存储this首先在调用该函数之前 例如 class myClass constructor gt element id element click gt myMethod
  • React 中的 HTML5 音频标签

    我想在我的 React 应用程序中使用一个简单的 HTML5 音频标签 我的组件如下所示 import React from react class AudioPlayer extends React Component render re
  • 清理magento缓存时开始和结束标记不匹配:/Varien/Simplexml/Config.php

    Entity line 60 parser error Opening and ending tag mismatch config line 28 and confg in home theprint public html lib Va
  • Eclipse Luna Dark 主题,语法着色重置。如何禁用?

    原问题 Eclipse luna 主题问题 https stackoverflow com questions 24628143 eclipse luna theme issue 相关问题 如何使 Eclipse 颜色设置永久生效 http
  • 从 Maven 运行 Ant 任务

    我使用 Ant 构建自定义 jar 库 然后在 Maven 中将其用作依赖项
  • 作为 Upstart 服务启动时无法读取 UTF-8 文件名

    我的 Java 程序递归地读取目录的内容 这是一个示例树 注意非 ASCII 字符 sviluppo sviluppo cia sviluppo cia subdir sviluppo pippo sviluppo pippo prova2