[英]Stuck with daemon calling bash script on macos; any ideas?
我是腳本和守護進程的新手,玩了一段時間后,發現自己卡住了。
情況是這樣的:在 macOS 上,我有一個名為“maza”的程序,它使用在線黑名單更新我的主機文件。 我想每周運行一次這個程序,以跟上黑名單的變化。 在使用 cronjobs(沒有用)試試運氣之后,我現在正在嘗試使用守護進程。 所以我有:
我的 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}"
}
這開始是作為評論,但后來失控了。
如果我正在對此進行故障排除,以下是我要檢查和嘗試的內容的不完整列表:
ls -l /etc/scriptmaza.sh
說什么?)$PATH
中是否有maza
可執行文件? <key>StandardOutPath</key>
<string>/var/log/scriptmaza.log</string>
<key>StandardErrorPath</key>
<string>/var/log/scriptmaza.log</string>
echo
命令或date
(如果不記錄 stdout/stderr,則需要明確編寫使用>> /var/log/scriptmaza.log
左右的文件) (FWIW, /etc/
不是可執行腳本的好地方,但它不應該阻止工作。你也不需要在腳本中使用sudo
,因為它無論如何都會以 root 身份運行,如果它沒有' t,無論如何都沒有用於輸入密碼的交互式控制台。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.