簡體   English   中英

卡在 macOS 上調用 bash 腳本的守護進程; 有任何想法嗎?

[英]Stuck with daemon calling bash script on macos; any ideas?

我是腳本和守護進程的新手,玩了一段時間后,發現自己卡住了。

情況是這樣的:在 macOS 上,我有一個名為“maza”的程序,它使用在線黑名單更新我的主機文件。 我想每周運行一次這個程序,以跟上黑名單的變化。 在使用 cronjobs(沒有用)試試運氣之后,我現在正在嘗試使用守護進程。 所以我有:

  • 一個名為 com.mazaupdate.plist 的文件位於 /Library/LaunchDaemons
  • 一個名為 scriptmaza.sh 的腳本位於 /etc(因為這是主機文件所在的位置)

我的 plist 說了以下內容(基本上它試圖啟動腳本 - 此時每 60 秒一次,用於測試目的)。

<?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>com.mazaupdate</string>
    <key>ProgramArguments</key>
    <array>
        <string>/etc/scriptmaza.sh</string>
    </array>
    <key>StartInterval</key> 
        <integer>60</integer>
</dict>
</plist>

我的腳本如下所示(它只是停止 maza,這比“更新”更容易測試,因為目前沒有對主機文件進行在線更新)。

#!/bin/sh
sudo maza stop

一旦測試結束,plist 將被修改為僅每周啟動腳本,並且腳本將更新為“maza update”。

有了我的兩個文件,我會:

sudo chown root /Library/LaunchDaemons/com.mazaupdate.plist 
sudo chgrp wheel /Library/LaunchDaemons/com.mazaupdate.plist

sudo launchctl load com.mazaupdate.plist 

但是,幾分鍾后我測試maza的狀態時,它總是顯示“enabled”,這意味着停止命令沒有被正確使用。 當然,如果我只是在終端中使用“sudo maza stop”,maza 會正確停止並且狀態變為“已禁用”,如果腳本有效,情況應該如此。

這就是我的全部。 任何的想法? 謝謝!

編輯:

根據下面@pmdj 的評論,這就是我們的立場。

在 scriptmaza.sh 上執行 chmod +x 后,權限為:-rwxr-xr-x@ 1 ken wheel 80 17 Feb 12:22 /etc/scriptmaza.sh

修改后的 scriptmaza.sh 現在是:

#!/bin/sh
/usr/local/bin/maza stop
date >> /Users/Ken/Downloads/file.dat

加載守護進程一段時間后,file.dat 確實會在正確的日期每分鍾創建和編輯一次,這意味着守護進程確實會啟動腳本。

控制台顯示正在正確加載和卸載的守護程序,並且 scriptmaza 記錄了多行“tput:$TERM 沒有值並且沒有指定 -T”

同時,maza 的狀態仍然是“已啟用”。

EDIT2:maza 作者說“不,沒有標志,因為它不是必需的。我可以確認它作為守護進程運行,因為這就是它在我的計算機上的工作方式。腳本中沒有任何你不能按行運行的內容來自終端的線路。如果你想知道發生了什么,第一步是打開它並運行每一行。祝你好運?” 這有幫助嗎?

EDIT3:刪除了顏色的“tput”元素。 守護進程仍然成功啟動 mazascript,它成功地將日期添加到專門創建的 file.dat 中。 然而,maza 實際上並沒有停止,正如它在腳本中應該的那樣(當它工作時,將被替換為“更新”)。 日志現在給出一個新錯誤,顯示“錯誤。如果您使用的是 OSX,則必須安裝 gsed”。 手動啟動 maza 時不會發生此錯誤,並且 gsed 已經安裝(“brew install gnu-sed”給出“gnu-sed 4.8 已經安裝並且是最新的。重新安裝......”。 Gsed 的別名位於“/usr/local/bin”。maza(測試gsed)的相關部分如下:

custom-sed() {
    if [[ $THIS_OS = *$NAME_OSX* ]]; then
        # Check if OSX and install GSED
        if [ -x "$(command -v gsed)" ]; then
            gsed "$@"
        else
            echo "${COLOR_RED}ERROR. You must install gsed if you are using OSX${COLOR_RESET}"
            exit 1
        fi
    else
        # Linux
        sed "$@"
    fi
}
export -f custom-sed

EDIT4:這里是相關部分; 首先是變量,然后是更新/啟動函數。

# VARIABLES
NAME_OSX="Darwin"
THIS_OS=$(uname -mrs)
PROGNAME=$(basename $0)
[[ -z "${XDG_CONFIG_HOME}" ]] && CONFIG=$HOME/.maza/ || CONFIG=$XDG_CONFIG_HOME/maza
HOST_FILE=(/etc/hosts)
COLOR_RED=""
COLOR_GREEN=""
COLOR_RESET=""
LIST="list"
LIST_DNSMASQ="dnsmasq.conf"
START_TAG="## MAZA - List ad blocking"
PROJECT="### https://github.com/tanrax/maza-ad-blocking"
AUTHOR="### Created by Andros Fenollosa (https://programadorwebvalencia.com/)"
END_TAG="## END MAZA"
PATH=$PATH:/usr/local/bin
update() {
    # Make conf folder
    rm -f $CONFIG$LIST
    rm -f $CONFIG$LIST_DNSMASQ
    mkdir -p $CONFIG
    # Download DNS list
    curl -L -s "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" -o "$CONFIG$LIST"
    # Clear list
    ## Remove comments
    # custom-sed -i.bak '/^#/ d' "$CONFIG$LIST"
    # Make dnsmasq format
    ## 127.0.0.1 doubleclick.net to address=/doubleclick.net/127.0.0.1
    cp "$CONFIG$LIST" "$CONFIG$LIST_DNSMASQ"
    custom-sed -i.bak 's/127.0.0.1 /address=\//g' "$CONFIG$LIST_DNSMASQ"
    custom-sed -i.bak 's/$/\/127.0.0.1/g' "$CONFIG$LIST_DNSMASQ"
    ## Add start tag DNS list in first line
    custom-sed -i.bak "1i\\$AUTHOR" "$CONFIG$LIST"
    custom-sed -i.bak "1i\\$PROJECT" "$CONFIG$LIST"
    custom-sed -i.bak "1i\\$START_TAG" "$CONFIG$LIST"
    ## Add end tag DNS list in first line
    echo $END_TAG >> "$CONFIG/$LIST"
    ## Add start tag DNS dnsmasq in first line
    custom-sed -i.bak "1i\\$AUTHOR" "$CONFIG$LIST_DNSMASQ"
    custom-sed -i.bak "1i\\$PROJECT" "$CONFIG$LIST_DNSMASQ"
    custom-sed -i.bak "1i\\$START_TAG" "$CONFIG$LIST_DNSMASQ"
    ## Add end tag DNS DNSMASQ in first line
    echo $END_TAG >> "$CONFIG$LIST_DNSMASQ"
    # Remove temp file
    rm "$CONFIG$LIST.bak"
    rm "$CONFIG$LIST_DNSMASQ.bak"
    # Notify user
    echo "${COLOR_GREEN}List updated!${COLOR_RESET}"
}

start() {
    update
    # Add List to host file
    cat "$CONFIG/$LIST" >> "$HOST_FILE"
    # Notify user
    echo "${COLOR_GREEN}ENABLED!${COLOR_RESET}"
}

這開始是作為評論,但后來失控了。

如果我正在對此進行故障排除,以下是我要檢查和嘗試的內容的不完整列表:

  1. 腳本的權限是什么? 它是可執行的嗎? ls -l /etc/scriptmaza.sh說什么?)
  2. root 用戶的默認$PATH中是否有maza可執行文件?
  3. 您是否在系統日志中看到任何相關內容?
  4. 您是否嘗試過從腳本中記錄任何 output 和錯誤? 將類似這樣的內容添加到您的 launchd plist 中:
    <key>StandardOutPath</key>
    <string>/var/log/scriptmaza.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/scriptmaza.log</string>
  1. 您是否嘗試過向腳本添加任何其他副作用,您可以將其用作檢查腳本是否正在運行的證據,例如echo命令或date (如果不記錄 stdout/stderr,則需要明確編寫使用>> /var/log/scriptmaza.log左右的文件)

(FWIW, /etc/不是可執行腳本的好地方,但它不應該阻止工作。你也不需要在腳本中使用sudo ,因為它無論如何都會以 root 身份運行,如果它沒有' t,無論如何都沒有用於輸入密碼的交互式控制台。)

暫無
暫無

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

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