[求助]ActiveMQ Artemis, shell 中可以正常启动,但使用 systemctl start 无法启动

2022-04-15 09:11:20 +08:00
 pocketz

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 $@ ${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
2020 次点击
所在节点    Linux
20 条回复
Kobayashi
2022-04-15 09:31:29 +08:00
不要使用启动脚本,systemd 直接管理 daemon. 把 start 脚本里除去 nohup 的部分提取出来。
oneisall8955
2022-04-15 09:57:22 +08:00
核心代码:
把 systemd 的 User 修改成和脚本的${ARTEMIS_USER}一致,然后 systemd 的 ExecStart 启动命令修改为
${ARTEMIS_INSTANCE}/bin/artemis" run > /dev/null 2> /dev/null
一致
julyclyde
2022-04-15 10:52:35 +08:00
@oneisall8955 不要重定向 stdout 和 stderr 。systemd 会收集的
julyclyde
2022-04-15 10:53:30 +08:00
一般使用 init 脚本的服务,启动后进程都会转后台,所以这时候不应该用 forking 类型
建议 simple 类型+PIDFile

或者进行彻底的 systemd 化改造
oneisall8955
2022-04-15 11:14:16 +08:00
@julyclyde #3 谢谢大佬指教~
oneisall8955
2022-04-15 11:14:31 +08:00
pocketz
2022-04-15 11:18:29 +08:00
@Kobayashi
@oneisall8955
@julyclyde
现在去掉了 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 启动了。只是没实现开机启动,倒不影响使用
pocketz
2022-04-15 11:22:18 +08:00
@oneisall8955

我靠,这个文件我昨晚上试过的,也是 Could not start ${service}

但刚才我又试了一下,竟然绿了!可以启动了

太奇怪了,可能是我昨晚输错了?
oneisall8955
2022-04-15 11:30:42 +08:00
@pocketz #8 撒花~
pocketz
2022-04-15 11:34:43 +08:00
@oneisall8955
@julyclyde

看来我的记忆没出错,只绿了一小段时间,还是红了

提示
```
artemis.service holdoff time over, scheduling restarting.
start request repeated too quickly for artemis.service
failed to start
```
pocketz
2022-04-15 11:36:25 +08:00
脚本本身的提示是,启动之后又调用了 stop 命令
pocketz
2022-04-15 11:50:36 +08:00
@julyclyde

对了,请问 journalctl -xe 中提示的 Unregisted Authentication Agent for unix-process:5032:5410854 和启动失败有关系吗
julyclyde
2022-04-15 14:07:29 +08:00
@pocketz 修改过 service 之后需要 systemctl daemon-reload 才能生效的
julyclyde
2022-04-15 14:09:01 +08:00
@pocketz Unregisted Authentication Agent for unix-process 是 polkit 的日志。具体情况不了解
julyclyde
2022-04-15 14:14:03 +08:00
@oneisall8955
把 systemd 的 User 修改成和脚本的${ARTEMIS_USER}一致,在一些情况下会失败(不过你这个案例大概不会失败)

systemd 的 User 是先降级用户权限,后执行 ExecStart
init 脚本是刚开始 root 权限,由服务进程初始化之后自己去降级(脚本里 sudo 命令)


我建议你把脚本里面重定向去掉,用 systemd 运行看看日志
oneisall8955
2022-04-15 15:11:56 +08:00
服务器下了个 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
pocketz
2022-04-15 15:45:08 +08:00
@julyclyde
谢谢,我去试下

@oneisall8955
感谢提供案例!我找找我机器的问题
oneisall8955
2022-04-15 15:56:57 +08:00
@pocketz #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
pocketz
2022-04-15 16:10:17 +08:00
@oneisall8955

遇到过找不到 java 的这种情况,我是把 JAVA_HOME 放在了 artemis.profile ,然后在 EnvironmentFile 指定了这个文件
tramm
2022-04-15 21:08:32 +08:00
我记得这个都停止维护了吧? 还用这个的嘛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX