CentOS 8上systemd守護程序內的螢幕
所以我想在 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 守護程序中工作?上述解決方案是個好主意,還是有更好的方法?
我希望能夠做的例子:
- 有一個 systemd 計時器,
ExecStartPre=/screen -p 0 -S -X eval 'stuff "save-all"\\015'
其序列中有一個(或類似的)。- ExecStop 期間的一系列命令,如上面的命令。
- 當我手動連接到 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 777
或ExecStartPre=+ ...
類似的安全性降低解決方案。另一種解決方案是使用 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