1

我是脚本和守护程序的新手,玩了一段时间后,发现自己卡住了。

情况如下:在 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 的状态时,它总是说“启用”,这意味着停止命令没有正确使用。当然,如果我只是在终端中使用“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 的状态仍然是“启用”。

4

1 回答 1

0

这开始是一个评论,但失控了。

这是一个不完整的列表,列出了我在解决此问题时要检查和尝试的内容:

  1. 脚本的权限是什么?是否可执行?(ls -l /etc/scriptmaza.sh说什么?)
  2. 可执行文件是否maza在 root 用户的默认值中$PATH
  3. 您是否在系统日志中看到任何相关内容?
  4. 您是否尝试过记录脚本中的任何输出和错误?将这样的内容添加到您的已启动 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 身份运行,如果没有,则没有无论如何输入密码的交互式控制台。)

于 2022-02-16T09:45:11.283 回答