2013-10-31 24 views
0

后台服务结果下面的代码段运行过程中的异常

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) 

前台任务

exec bin/server.sh 

文件存在:

[email protected]:~$ ls -l /var/log/syslog 
-rw-r----- 1 syslog adm 616642 Sep 6 15:59 /var/log/syslog 

的尼汝用户标识有权读取该文件:

[email protected]:~$ id -a niru 
uid=2001(niru) gid=2001(niru) groups=2001(niru),4(adm),27(sudo) 
[email protected]:~$ 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 

任何人都可以让我知道什么是这样做的原因?

回答

1

此权限问题,因为在Debian发行版上运行服务的用户的凭证与用户的凭证不同。

例如,作为“尼汝”用户ID登录时,通过id -a'命令将返回此输出:

[email protected]:~$ 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) 

因此,在服务方面,尼汝用户标识没有权限读取的/ var/log/syslog的文件。

This bug in Upstart is documented here: https://bugs.launchpad.net/upstart/+bug/812870 

将setgid参数添加到服务启动文件解决了问题。

1

通过运行sudo start server该进程不再以用户niru运行,因此不再有权访问syslog文件。

+0

但是,当我做了这个过程的ps,我看到用户为niru。那么原因是什么?用户niru拥有sudo权限。 –