我正在尝试使用jsvc来创建一个守护进程,听起来某些事情可以用root来完成(例如,Tomcat显然可以绑定到特权端口)。我想知道的是如何做到这一点。
在我的简单守护进程程序中,我尝试打开一些只能在init()
进程中以root身份读取的文件,但我已经以我当时选择的用户身份运行(在我的情况下,“没人”) “)。如果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