[英]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.