我创建了一个应该作为ubuntu服务运行的Java应用程序。我遵循了这篇文章:Running a Java program as a daemon in Ubuntu Linux
这是/etc/init.d/
目录中的脚本:
#!/bin/sh
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Start/stop myservice
### END INIT INFO
case $1 in
status)
if [ -f /opt/myservice/pid ]; then
PID=$(cat /opt/myservice/pid);
echo "myservice is running. PID="$PID
else
echo "myservice is not running."
fi
;;
start)
if [ ! -f /opt/myservice/pid ]; then
nohup java -jar /opt/myservice/billing_consumer.jar /opt/myservice 2>> /dev/null >> /dev/null &
echo $! > /opt/myservice/pid
echo "myservice started ..."
else
echo "myservice is already running ..."
fi
;;
stop)
if [ -f /opt/myservice/pid ]; then
PID=$(cat /opt/myservice/pid);
kill $PID;
echo "myservice stopped ..."
rm /opt/myservice/pid
else
echo "myservice is not running ..."
fi
;;
restart)
if [ -f /opt/myservice/pid ]; then
PID=$(cat /opt/myservice/pid);
echo "Stopping myservice ...";
kill $PID;
echo "myservice stopped ...";
rm /opt/myservice/pid
echo "Starting myservice ..."
nohup java -jar /opt/myservice/billing_consumer.jar /opt/myservice 2>> /dev/null >> /dev/null &
echo $! > /opt/myservice/pid
echo "myservice started ..."
else
echo "myservice is not running ..."
fi
;;
esac
此脚本似乎会关闭billing_consumer.jar
标准输入并将输出重定向到/dev/null
;其中,我在某处读到bitbucket
用于将控制台的输出重定向到此处的输出。此外,除了使用这些输出的某些第三方组件外,我无法向stderr
或stdout
发送任何内容。我自己使用java的构建日志API(java.util.logging.Logger
)来记录信息。我使用java.util.logging.FileHandler
作为记录输出的处理程序。但问题是,当我运行程序作为服务日志记录不起作用。但是当我手动运行程序时,我可以看到文件中写入的日志。这是我用于记录配置的logging.properties
文件:
handlers = java.util.logging.FileHandler
config =
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.filter =
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.encoding =
java.util.logging.FileHandler.limit = 1048576
java.util.logging.FileHandler.count = 20
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = logs/billing-log.%u.%g.log
...
我不认为这与/etc/init.d/myservice
脚本有任何关系,因为我改变了它以将输出重定向到文件,我可以看到第三方组件'输出写在文件中。虽然,我不是写信给终端'输出。任何人都可以弄清楚这里有什么问题。我是否以错误的方式配置了日志记录?
答案 0 :(得分:0)
在您的日志记录属性中,您使用的是relative path。当您将其作为服务运行时,当前/工作目录可能与手动运行时不同。 FileHandler将无法创建新的日志文件if the directory path doesn't exist。设置工作目录或将路径更改为绝对路径。
'config ='行看起来不对,因为没有值。
如果这不起作用,您应该修改脚本以将out / err流传输到文件以调试正在进行的操作。