配置流程:
1. 創建 Systemd 服務文件。這個文件通常存放在/usr/lib/systemd/system/目錄下,命名為 activemq.service。
#先創建文件,然后編輯:
sudo touch /usr/lib/systemd/system/activemq.service
sudo vim /usr/lib/systemd/system/activemq.service
2. 在文件中添加以下內容:
[Unit]
Description=Apache ActiveMQ
After=network.target[Service]
Type=forking
Environment="JAVA_HOME=/mrefuel/jdk1.8.0_181"
Environment="JAVACMD=$JAVA_HOME/bin/java"
ExecStart=/path/to/activemq/bin/activemq start #ExecStart 和 ExecStop 中的路徑需要替換為你的 ActiveMQ 安裝路徑。
ExecStop=/mrefuel/activemq/bin/activemq stop
Restart=on-failure #指定了在失敗時自動重啟服務。
RestartSec=10 #設置了重啟間隔為 10 秒。
User=root #User 和 Group 應該是運行 ActiveMQ 的用戶和組。如果沒有特定用戶,可以創建一個或使用默認用戶。
Group=root[Install]
WantedBy=multi-user.target
3. 重新加載 Systemd 配置
sudo systemctl daemon-reload
4. 啟用 ActiveMQ 服務開機自啟動
sudo systemctl enable activemq
5. 啟動 ActiveMQ 服務
sudo systemctl start activemq
6. 檢查服務狀態
sudo systemctl status activemq# 手動重啟
# sudo systemctl restart activemq
7.如何停止自啟動
sudo systemctl disable activemq
sudo systemctl stop activemq
sudo systemctl daemon-reload
遇到的問題:
- 此問題在自己搭建的虛擬機中出現,阿里云服務器完成以上步驟即可成功。
1. 執行 sudo systemctl start activemq,出現以下報錯。
Job for activemq.service failed because the control process exited with error code.
See "systemctl status activemq.service" and "journalctl -xeu activemq.service" for details.
2. 使用命令排查問題,發現以下報錯
- 執行 systemctl status activemq.service 發現運行失敗
- 再執行 journalctl -xeu activemq.service 查看詳細的失敗原因
5月 14 09:55:35 localhost.localdomain systemd[191750]: activemq.service: Failed to locate executable /path/to/activemq/bin/activemq: Permission denied
?? Subject: 進程 /path/to/activemq/bin/activemq 無法執行
?? Defined-By: systemd
?? Support: https://access.redhat.com/support
??
?? 進程 /path/to/activemq/bin/activemq 無法被執行并已失敗。
??
?? 該進程返回的錯誤代碼為 ERRNO。
3. 懷疑是權限問題,進行排查
#根據文件權限顯示,activemq 腳本具有執行權限 (rwxr-xr-x),并且所有者是 root 用戶和 root 組。
ls -l /path/to/activemq/bin/activemq
-rwxr-xr-x. 1 root root 21452 8月 22 2023 /path/to/activemq/bin/activemq
#sudo chmod +x /path/to/activemq/bin/activemqls -ld /path/to/activemq/bin/
#sudo chmod +x /path/to/activemq/bin/
4. 如果權限已經正確設置,但仍然出現權限被拒絕的錯誤,那么可能是由于 SELinux 或其他安全性機制導致的。
這里我直接做了 sudo setenforce 0 操作,執行 sudo systemctl start activemq 發現服務成功啟動。
-
檢查 SELinux 配置:檢查 SELinux 的配置是否會影響到 ActiveMQ 的執行。你可以通過運行 sestatus 命令來查看 SELinux 的狀態,以及通過 /etc/selinux/config 文件來查看 SELinux 的配置。
-
臨時禁用 SELinux:嘗試臨時禁用 SELinux,然后重新啟動 ActiveMQ,看看問題是否仍然存在。你可以使用以下命令來臨時禁用 SELinux:
sudo setenforce 0
-
檢查其他安全性機制:除了 SELinux 外,還有其他安全性機制可能會導致權限問題。確保你檢查了系統中是否還有其他安全性機制,并且了解它們是否會影響到 ActiveMQ 的執行。
5. 檢查 SELinux 的日志,查看它為什么阻止了 ActiveMQ 的操作。SELinux 的日志通常位于 /var/log/audit/audit.log 文件中。
type=AVC msg=audit(1715656532.025:18834): avc: denied { ioctl } for pid=204690 comm="activemq" path="/path/to/activemq/bin/activemq" dev="dm-0" ino=35441443 ioctlcmd=0x5401 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=1
type=SYSCALL msg=audit(1715656532.025:18834): arch=c000003e syscall=16 success=no exit=-25 a0=3 a1=5401 a2=7ffde2f5c190 a3=0 items=0 ppid=1 pid=204690 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="activemq" exe="/usr/bin/bash" subj=system_u:system_r:init_t:s0 key=(null)ARCH=x86_64 SYSCALL=ioctl AUID="unset" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"
type=PROCTITLE msg=audit(1715656532.025:18834): proctitle="(activemq)"
- 根據日志,可以看到 SELinux 拒絕了 ActiveMQ 進程對 /path/to/activemq/bin/activemq 文件的 ioctl 操作。這可能是導致 ActiveMQ 無法啟動的原因之一。
- 修改 SELinux 策略:針對 ActiveMQ 執行以下命令,允許它執行所需的 ioctl 操作:
sudo semanage fcontext -a -t bin_t "/path/to/activemq/bin/activemq"
sudo restorecon -v "/path/to/activemq/bin/activemq"
- 重新啟用 SELinux:完成上述步驟后,建議重新啟用 SELinux,而不是將其保持在 permissive 模式下。你可以執行以下命令:
sudo setenforce 1
- 再執行 sudo systemctl start activemq 問題已解決,配置成功。