[求助]ActiveMQ Artemis, shell 中可以正常启动,但使用 systemctl start 无法启动
Artemis 版本:2.19.1
JDK 1.8.0.271
尝试过使用不同权限用户,都无法使用 systemctl start 启动
Shell
使用 broker 中的 artemis-service start ,能够正常启动
systemctl
service 文件如下
[Unit]
Description=Apache ActiveMQ Artemis
After=network.target
[Service]
Type=forking
User=activemq
Group=activemq
ExecStart=/var/lib/jms-broker/bin/artemis-service start
ExecStop=/var/lib/jms-broker/bin/artemis-service stop
[Install]
WantedBy=multi-user.target
journalctl -xe中的 artemis-service 返回的信息很有限,除了 starting ,就只有Could not start ${service}
顺便贴一下 artemis-serive 启动脚本的内容,这个脚本是 artemis 自动生成的
service=basename "$0"
#
# Discover the ARTEMIS_INSTANCE from the location of this script.
#
if [ -z "$ARTEMIS_INSTANCE" ] ; then
## resolve links - $0 may be a link to ActiveMQ's home
PRG="$0"
saveddir=pwd
# need this for relative symlinks
dirname_prg=dirname "$PRG"
cd "$dirname_prg"
while [ -h "$PRG" ] ; do
ls=ls -ld "$PRG"
link=expr "$ls" : '.*-> \(.*\)$'
if expr "$link" : './.' > /dev/null; then
PRG="$link"
else
PRG=dirname "$PRG"
"/$link"
fi
done
ARTEMIS_INSTANCE=dirname "$PRG"
cd "$saveddir"
# make it fully qualified
ARTEMIS_INSTANCE=cd "$ARTEMIS_INSTANCE/.." && pwd
export ARTEMIS_INSTANCE
fi
PID_FILE="${ARTEMIS_INSTANCE}/data/artemis.pid"
if [ ! -d "${ARTEMIS_INSTANCE}/data/" ]; then
mkdir "${ARTEMIS_INSTANCE}/data/"
fi
status() {
if [ -f "${PID_FILE}" ] ; then
pid=cat "${PID_FILE}"
# check to see if it's gone...
ps -p ${pid} > /dev/null
if [ $? -eq 0 ] ; then
return 0
else
rm "${PID_FILE}"
return 3
fi
fi
return 3
}
stop() {
if [ -f "${PID_FILE}" ] ; then
pid=cat "${PID_FILE}"
kill [email protected] ${pid} > /dev/null
fi
for i in 1 2 3 4 5 ; do
status
if [ $? -ne 0 ] ; then
return 0
fi
sleep 1
done
echo "Could not stop process ${pid}"
return 1
}
start() {
status
if [ $? -eq 0 ] ; then
echo "Already running."
return 1
fi
if [ -z "$ARTEMIS_USER" -o id -un
= "$ARTEMIS_USER" ] ; then
nohup "${ARTEMIS_INSTANCE}/bin/artemis" run > /dev/null 2> /dev/null &
else
sudo -n -u ${ARTEMIS_USER} nohup "${ARTEMIS_INSTANCE}/bin/artemis" run > /dev/null 2> /dev/null &
fi
echo $! > "${PID_FILE}"
# check to see if stays up...
sleep 1
status
if [ $? -ne 0 ] ; then
echo "Could not start ${service}"
return 1
fi
echo "${service} is now running (${pid})"
return 0
}
case $1 in
start)
echo "Starting ${service}"
start
exit $?
;;
force-stop)
echo "Forcibly Stopping ${service}"
stop -9
exit $?
;;
stop)
echo "Gracefully Stopping ${service}"
stop
exit $?
;;
restart)
echo "Restarting ${service}"
stop
start
exit $?
;;
status)
status
rc=$?
if [ $rc -eq 0 ] ; then
echo "${service} is running (${pid})"
else
echo "${service} is stopped"
fi
exit $rc
;;
*)
echo "Usage: $0 {start|stop|restart|force-stop|status}" >&2
exit 2
;;
esac
不要使用启动脚本,systemd 直接管理 daemon. 把 start 脚本里除去 nohup 的部分提取出来。
核心代码:
把 systemd 的 User 修改成和脚本的${ARTEMIS_USER}一致,然后 systemd 的 ExecStart 启动命令修改为
${ARTEMIS_INSTANCE}/bin/artemis" run > /dev/null 2> /dev/null
一致
不要重定向 stdout 和 stderr 。systemd 会收集的
一般使用 init 脚本的服务,启动后进程都会转后台,所以这时候不应该用 forking 类型
建议 simple 类型+PIDFile
或者进行彻底的 systemd 化改造
#3 谢谢大佬指教~
找到的模板
gist.github.com/cmendesce/68208326b2997d1fb75a51ef89939d53 显示 Gist 代码
现在去掉了 forking ,加了
PIDFile=/var/lib/jms-broker/data/artemis.pid
改成
ExecStart=/var/lib/jms-broker/bin/artemis-service start
结果是返回了正常启动的信息,又马上自动关闭了
放弃了,直接 /var/lib/jms-broker/bin/artemis-service start 启动了。只是没实现开机启动,倒不影响使用
我靠,这个文件我昨晚上试过的,也是 Could not start ${service}
但刚才我又试了一下,竟然绿了!可以启动了
太奇怪了,可能是我昨晚输错了?
#8 撒花~
看来我的记忆没出错,只绿了一小段时间,还是红了
提示
artemis.service holdoff time over, scheduling restarting.
start request repeated too quickly for artemis.service
failed to start
脚本本身的提示是,启动之后又调用了 stop 命令
对了,请问 journalctl -xe 中提示的 Unregisted Authentication Agent for unix-process:5032:5410854 和启动失败有关系吗
修改过 service 之后需要 systemctl daemon-reload 才能生效的
Unregisted Authentication Agent for unix-process 是 polkit 的日志。具体情况不了解
把 systemd 的 User 修改成和脚本的${ARTEMIS_USER}一致,在一些情况下会失败(不过你这个案例大概不会失败)
systemd 的 User 是先降级用户权限,后执行 ExecStart
init 脚本是刚开始 root 权限,由服务进程初始化之后自己去降级(脚本里 sudo 命令)
我建议你把脚本里面重定向去掉,用 systemd 运行看看日志
服务器下了个 ActiveMQ Artemis ,运行起来了。没问题呀
服务器 debian9 ,java8 ,artemis 2.19.1
1 创建了 broker
/opt/software/apache-artemis/bin/artemis create /opt/artemis_brokers/foo
2 测试直接运行能否正常启动
/opt/artemis_brokers/foo/bin/artemis run
3 编写 artemis.service
[Unit]
Description=Artemis Server Service
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/opt/artemis_brokers/foo/bin/artemis run
[Install]
WantedBy=multi-user.target
4 复制到 systemd 文件夹及更新
cp artemis.service /etc/systemd/system
systemctl daemon-reload
5 启动及自启等
systemctl enable artemis.service
systemctl start artemis.service
谢谢,我去试下
感谢提供案例!我找找我机器的问题
#17 还需要环境变量,不然找不到 java 命令
- 创建 systemd service 配置文件夹
mkdir /etc/systemd/system/artemis.service.d - 创建环境变量文件
vim environment.conf
[Service]
Environment=JAVA_HOME=/opt/software/jdk1.8.0_181
- reload 配置
systemctl daemon-reload
遇到过找不到 java 的这种情况,我是把 JAVA_HOME 放在了 artemis.profile ,然后在 EnvironmentFile 指定了这个文件
我记得这个都停止维护了吧? 还用这个的嘛
公司在二线城市, 项目用户量不多; @前端已死 能让你自己选择? 0 基础也让转吗 转后端,测开 我是前端,如果自己没有兴趣倾向,建议选后端,理由是更能接近核心业务,更…
服务器接口返回的数据是 slatejs 的数据格式,类似 [{ "type": "paragraph", "children": [{ "type": "emot…
A.Java 方向还没摸熟,又去搞 go ,风险太大; B.Go 是大势所趋,学习又很好的前景; C.先把 JAVA 方向整明白,机会合适再看 GO 上面是我提出的几种想法,大…