以下代码
try {
String fileName = "/var/log/syslog";
File myFile = new File(fileName);
FileInputStream myStream = null;
System.out.println("canRead() returns " + myFile.canRead ());
System.out.println("canWrite() returns " + myFile.canWrite());
myStream = new FileInputStream(myFile);
myStream.close();
}
catch (FileNotFoundException e)
{
System.out.println("FileNotFoundException: " + e);
}
catch (IOException e)
{
System.out.println("IOException: " + e);
}
抛出
java.io.FileNotFoundException: /var/log/syslog (Permission denied)
作为后台服务运行时
sudo start server
但在作为前台任务运行时会成功
exec bin/server.sh
文件存在:
niru@node2:~$ ls -l /var/log/syslog
-rw-r----- 1 syslog adm 616642 Sep 6 15:59 /var/log/syslog
niru userid具有对该文件的读访问权:
niru@node2:~$ id -a niru
uid=2001(niru) gid=2001(niru) groups=2001(niru),4(adm),27(sudo)
niru@node2:~$ head -3 /var/log/syslog
Aug 1 15:47:57 node kernel: imklog 5.8.6, log source = /proc/kmsg started.
Aug 1 15:47:57 node rsyslogd: [origin software="rsyslogd" swVersion="5.8.6" x-pid="535" x-info="http://www.rsyslog.com"] start
Aug 1 15:47:57 node rsyslogd: rsyslogd's groupid changed to 103
任何人都可以告诉我这是什么原因吗?
答案 0 :(得分:1)
通过运行sudo start server
,该进程不再以用户niru
的形式运行,因此无法再访问syslog文件。
答案 1 :(得分:1)
此权限问题是因为在Debian发行版上运行服务的用户的凭据与用户的凭据不同。
例如,当以'niru'userid登录时,'id -a'命令返回此输出:
niru@node2:~$ id -a
uid=2001(niru) gid=2001(niru) groups=2001(niru),4(adm),27(sudo)
在服务过程的上下文中,相同的'id -a'命令返回:
uid=2001(niru) gid=2001(niru) groups=2001(niru)
因此,在服务上下文中,niru userid没有读取/ var / log / syslog文件的权限。
This bug in Upstart is documented here: https://bugs.launchpad.net/upstart/+bug/812870
将setgid参数添加到服务启动文件解决了这个问题。