簡體   English   中英

在 macOS 上以非 root 用戶運行已啟動的服務

[英]Running Launchd Services with Non Root User on macOS

我正在構建一個可以運行 java 服務的 launchctl 服務。 我能夠使用 root 用戶創建 launchctl 服務,並在重啟用例中測試啟動/停止/狀態/自動啟動。

我正在努力與非 root 用戶運行相同的 launchctl 服務(在我的例子中是ec2-user

我的plist文件如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>siem</string>
  <key>ProgramArguments</key>
  <array>
    <string>java</string>
    <string>-jar</string>
    <string>/Users/ec2-user/siem.jar</string>
  </array>
  <key>RunAtLoad</key>
  <true/> <!-- run the program at login -->
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
  <key>WorkingDirectory</key>
  <string>/Users/ec2-user</string>
   <key>StandardErrorPath</key>
   <string>/tmp/mycommand.err</string>
   <key>StandardOutPath</key>
   <string>/tmp/mycommand.out</string>
</dict>
</plist>

我嘗試了各種步驟來使用ec2-user運行上述服務。 ec2-user的 UID 是 501。

ec2-user@ip-172-31-30-212 ~ % launchctl bootstrap gui/501 ~/Library/LaunchDaemons/siem.plist
Bootstrap failed: 125: Unknown error: 125

驗證plist文件的內容

ec2-user@ip-172-31-30-212 ~ % plutil ~/Library/LaunchDaemons/siem.plist
/Users/ec2-user/Library/LaunchDaemons/siem.plist: OK

嘗試與user引導服務

ec2-user@ip-172-31-30-212 ~ % launchctl bootstrap user/501 ~/Library/LaunchDaemons/siem.plist
Bootstrap failed: 5: Input/output error

以上所有錯誤都不冗長,似乎沒有找到任何方法。

我的目標:我想用非 root 用戶運行 launchctl 服務。

環境詳情:

操作系統:AWS EC2 實例上的 macOS

macOS 版本:BigSur 和 Monterey

提前致謝。

我只是花了很多時間讓它工作,但它很復雜。

gui域僅在用戶使用圖形用戶會話登錄后可用。 在它不可用時嘗試向它添加服務會導致錯誤。

user域在登錄后可用(例如通過 SSH),但要向該域添加服務,your.plist 必須包含以下鍵和值:

<key>LimitLoadToSessionType</key>
<string>Background</string>

如果這個鍵不存在,你會得到可怕的“輸入/輸出錯誤”,因為這個屬性的默認值是Aqua (即需要 GUI 上下文)。 有關這些會話類型的更多信息,請參見此處

問題是user域中的任何這些服務都不會在重新啟動時自動啟動。 讓進程在重啟后運行的最佳解決方案是將它們作為根添加到system域,然后將<UserName>鍵添加到 your.plist 以作為特定用戶運行它。

假設您想以用戶身份運行 launchd 代理,請執行以下操作:

不要直接在.plist文件中調用 java,而是將命令傳遞給 shell。 這確保設置了 java 所需的所有環境變量(如 JAVA_HOME)。 另外,使用絕對路徑:

<key>ProgramArguments</key>
<array>
  <string>/bin/zsh</string>
  <string>-c</string>
  <string>java -jar /Users/ec2-user/siem.jar</string>
</array>

接下來,我認為你的引導程序命令是錯誤的。 我猜你必須像這樣使用它:

launchctl bootstrap gui/"$(id -u)"/siem

要驗證代理是否成功啟動,請執行

launchctl kickstart gui/"$(id -u)"/siem

另一個很好的資源是https://launchd.info/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM