Systemd

CentOS 8上systemd守護程序內的螢幕

  • September 3, 2021

所以我想在 systemd 服務中執行 screen,這樣我就可以在程序執行時(在守護程序內部)發出命令。請參閱問題末尾的範例,了解我希望能夠做什麼。

我目前擁有的:

ExecStart=/usr/bin/java -someArguments -jar server.jar一個以-running 作為守護程序 啟動的 java 應用程序,其中 user:group 設置為“server”:“server”,以及“ProtectSystem=full”和類似的強化參數。這執行良好,沒有問題。

但是,我想要: 與上面相同,但它在螢幕實例中執行。像這樣的東西:

ExecStart=/usr/bin/screen -DmS aServer /usr/bin/java -someArguments -jar server.jar

後者拒絕啟動,輸出journalctl -xe告訴我:“無法執行命令:權限被拒絕”。但是,如果我自己在終端中執行此操作(與 ExecStart 中的命令相同),我可以從同一使用者(伺服器:伺服器)啟動螢幕會話。

我在網上找到了一個解決方案,上面寫著:

# Uncomment this to fix screen on RHEL 8

ExecStartPre=+/bin/sh -c 'chmod 777 /run/screen'

但我本能地不喜歡 777 部分,我也不明白為什麼每次守護程序啟動時都需要執行它。

**我基本上要問的是:**如何讓螢幕在 systemd 守護程序中工作?上述解決方案是個好主意,還是有更好的方法?


我希望能夠做的例子:

  1. 有一個 systemd 計時器,ExecStartPre=/screen -p 0 -S -X eval 'stuff "save-all"\\015'其序列中有一個(或類似的)。
  2. ExecStop 期間的一系列命令,如上面的命令。
  3. 當我手動連接到 Linux 伺服器(連接到螢幕實例)時,能夠與程序互動。

很抱歉回复晚了,我實際上已經找到並解決了這個問題。

此問題源於基於 RHEL8 的作業系統上的 SELinux 配置

由於其安裝位置,守護程序內部的螢幕被 centos8(可能還有 Rocky Linux 或 RHEL 8 的其他衍生版本)上的 SELinux 阻止。有一些 SEL 策略阻止守護程序在 /usr/bin/ 中執行程序 - 如果我理解正確的話。不幸的是,我不記得我在哪裡偶然發現了這些資訊。


一種解決方案是在安裝螢幕後將其複製到其他位置,例如/usr/local/bin. 複製執行檔後,確保將其所有權root:screen和權限設置為-rwxr-xr-x (chmod 755).

然後只需從新位置執行螢幕:

ExecStart=/usr/bin/screen -DmS aServer /usr/bin/java -someArguments -jar server.jar

不需要(不要)任何chmod 777ExecStartPre=+ ...類似的安全性降低解決方案。


另一種解決方案是使用 SEL 的 audit2allow 功能,首先找到螢幕被阻止的報告,/var/log/audit/audit.log然後使用條目的標識名稱(如name=something),然後將其發送到 audit2allow,如下所示:

grep 'screen-or-other-name-found' /var/log/audit/audit.log | audit2allow -M screen-inside-daemon

semodule -i screen-inside-daemon.pp

這應該創建一個允許設置工作的 SELinux 策略。通過執行驗證:semodule -l | grep screen-inside-daemon並通過測試服務。

我沒有測試後一種方法,並且我不再有任何實例會包含此問題的日誌,因此 audit.log 條目的名稱未指定。

要在 Linux 中將基於 Java 的伺服器作為守護程序執行,您可能需要查看 Apache Tomcat 之類的配置。

它從一個名為的服務開始/etc/systemd/system/tomcat.service

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

請注意,您的伺服器將由腳本中的命令啟動/opt/tomcat/bin/startup.sh

然後您可以執行以下命令:

sudo systemctl daemon-reload

sudo systemctl start tomcat

sudo systemctl status tomcat

引用自:https://serverfault.com/questions/1037424