2016-01-20 92 views
0

這launchd的守護進程是系統守護進程(而不是用戶代理),並設計成從睡眠OSX:launchd的守護程序沒有運行我的腳本文件

運行喚醒時的腳本文件安裝代碼:

#!/bin/sh 

#find current working directory. store as $curr. use to reference anything in $curr/mysecureview. 
curr=$(pwd) 

echo "+copy the plist to the system daemons directory." 
cp $curr/sleepwatcher/config/sleepwatcher.system.plist /System/Library/LaunchDaemons/sleepwatcher.system.plist 

echo "+create the /etc/mysecureview directory to contain all program files." 
sudo mkdir /etc/mysecureview 

echo "+copy the log file to contain the compiled set of log entries." 
sudo cp $curr/log.txt /etc/mysecureview/log.txt 

echo "+create the file to contain the individual set of pre-compiled log-entries." 
sudo mkdir /etc/mysecureview/logs 

echo "+copy the shell script to be used at bootup/wakeup" 
sudo cp $curr/sleepwatcher/config/rc.wakeup /etc/mysecureview/rc.wakeup 

echo "+move imagesnap" 
sudo cp $curr/imagesnap-master/imagesnap /etc/mysecureview/imagesnap 

#establishing root ownership of /etc/mysecureview/ 
#sudo chmod 700 /etc/mysecureview 
#echo "+establishing root ownership of /etc/mysecureview/" 

echo "========================" 
echo "~Installation Succesful~" 
echo "========================" 

plist中:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
    <string>sleepwatcher.system</string> 
    <key>ProgramArguments</key> 
    <array> 
      <string>/usr/local/sbin/sleepwatcher</string> 
      <string>-V</string> 
      <string>-w /etc/mysecureview/rc.wakeup</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>KeepAlive</key> 
    <true/> 
</dict> 
</plist> 

腳本本身:

#!/bin/sh 
sudo cd /etc/mysecureview/ 
sudo ./imagesnap 

./imagesnap拍攝一張照片並將它放在同一個目錄中。該文件被命名爲「snapshot.jpg」。我搜索了整個mac,並沒有任何這個名字的.jpg。我認爲問題在於創建或安裝plist,但是在launchd上搜索OSX開發者頁面並不是很有幫助。

+2

'sudo cd ...'改變目錄,然後立即退出改變目錄的shell。下一個'sudo'命令再次從默認/初始目錄開始。 –

回答

1

我在這裏看到一些問題,一些致命的,一些不那麼嚴重。

  • 由於伊坦賴斯納指出,sudo cd因爲cd發生在子沒有做什麼有用的。實際上,由於腳本應該以root用戶身份運行,因此不需要使用sudo。這是幸運的,因爲如果sudo需要它不會工作,因爲沒有人在那裏輸入管理員密碼來授權它。

  • 自定義啓動守護進程應安裝在/ Library/LaunchDaemons中,而不是在/ System中。 El Capitan將阻止/ System中的安裝;在以前的版本中,這可能是一個壞主意。

  • 說起來,沒有錯誤檢查任何地方。在El Cap中,試圖在/ System/Library/LaunchDaemons中安裝守護程序的cp命令將失敗,但腳本將通過並宣佈「〜Installation Succesful〜」。另外,在腳本本身中,您只需假定cd成功;您應該始終檢查cd命令的失敗,因爲如果失敗,腳本的其餘部分將以意外運行並帶有潛在危險的結果。

  • 設置爲true的RunAtLoadKeepAlive鍵,守護程序將立即啓動時,只要它完成它會一而再,再而再次運行運行,然後......你需要更改的啓動守護進程.plist,因此它只會在適當的時候啓動腳本,或者讓腳本自己在適當的時候在imagesnap的背景下掛起。

  • 守護程序標籤應該是反向DNS格式,即標籤應該以相反順序(即apple.com - > com.apple)以腳本開發者的域名開頭。如果您沒有域名,我建議以「本地」開頭。

  • 在您重新啓動系統之前,守護進程將不會被加載。如果您希望在安裝後立即激活它,請將sudo launchctl load /Library/LaunchDaemons/daemonname.plist添加到安裝腳本中(並且如果其餘安裝成功,請確保它僅運行)。

    您可能還想檢查是否已安裝舊版本的守護程序,如果已卸載它(sudo launchctl unload ...),則需要先替換它。

  • 傳遞給腳本的參數(「-V」和「-w /etc/mysecureview/rc.wakeup」)不被腳本使用;我認爲他們打算稍後實施?如果是這樣的話,你可能應該使用「-w」和「/etc/mysecureview/rc.wakeup」單獨的參數,而不是在中間有空格的單個參數。

  • 該腳本本身不做任何日誌記錄(錯誤,成功或其他)。這對於一般操作並不好,並且會使調試變得困難。最好的選擇是讓腳本自己做日誌記錄,但爲了調試它可能更容易將<key>StandardOutPath</key><string>/tmp/sleepwatcher.out</string><key>StandardErrorPath</key><string>/tmp/sleepwatcher.err</string>添加到守護程序plist文件中。請注意,只有重新啓動計算機後,plist的更改纔會生效,或使用sudo launchctl unloadsudo launchctl load

  • 安裝腳本查找與當前工作目錄相關的安裝程序文件,這通常不安全 - CWD從腳本運行的任何內容繼承而來,可以是任何內容。您是否在嘗試查找與腳本位置相關的安裝資源?如果是這樣,做可靠性並不容易;見this previous question

0

要通過在MacOS的launchd執行腳本,你需要:

  1. 您的腳本創建任務定義文件(的.plist)
  2. 把任務文件到~/Library/LaunchAgents
  3. 使用Launchctl來管理任務

由於您不確定您的腳本是否執行ð成功與否,你可以在你的plist文件中指定輸出文件:

<!-- Output error messages --> 
<key>StandardErrorPath</key> 
<string>/Users/myname/path/to/stderr.log</string> 

<!-- Output messages --> 
<key>StandardOutPath</key> 
<string>/Users/myname/path/to/stdout.log</string> 

爲了獲得更詳細的信息和說明,你可以看到這篇post

相關問題