我正在尝试使用 jsvc 来创建一个守护进程,听起来某些事情可以用它以 root 身份完成(例如,Tomcat 显然可以绑定到特权端口)。我想知道的是如何做到这一点。
在我的简单守护程序程序中,我尝试打开一些在此init()
过程中只能以 root 身份读取的文件,但我已经以我当时选择的用户身份运行(在我的情况下,“nobody”)。如果 Tomcat 可以绑定到特权端口,似乎我应该能够打开 root 拥有的配置文件。
我是在尝试做一些 jsvc 不适合做的事情,还是我只是错过了一些东西?
我的代码:
public class MediaProcessorDaemon implements Daemon {
ClassPathXmlApplicationContext spring = null;
/*- (non-Javadoc)
* @see org.apache.commons.daemon.Daemon#init(org.apache.commons.daemon.DaemonContext)
*/
@Override
public void init(DaemonContext context) throws DaemonInitException, Exception {
/* This next line throws an exception */
this.spring = new ClassPathXmlApplicationContext("/META-INF/spring/media-processor-context.xml");
}
/*- (non-Javadoc)
* @see org.apache.commons.daemon.Daemon#start()
*/
@Override
public void start() throws Exception {
this.spring.start();
}
/*- (non-Javadoc)
* @see org.apache.commons.daemon.Daemon#stop()
*/
@Override
public void stop() throws Exception {
if (this.spring != null) {
this.spring.stop();
}
}
/*- (non-Javadoc)
* @see org.apache.commons.daemon.Daemon#destroy()
*/
@Override
public void destroy() {
if (this.spring != null) {
this.spring.close();
}
}
}
和错误信息:
org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: /etc/media/media-processor.properties (Permission denied)
at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:78)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:663)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:638)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:407)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.mycompany.mediaprocessor.MediaProcessorDaemon.init(MediaProcessorDaemon.java:24)
[snip]
所以在 中init()
,我试图打开一个只能由 root (/etc/media/media-processor.properties) 读取的文件,并且我得到“权限被拒绝”。
我像这样执行它:
sudo jsvc -debug -user nobody -cp $classPath com.mycompany.MediaProcessorDaemon