启动时通过 launchd 运行脚本时出错,但在终端中运行脚本时不会出错

启动时通过 launchd 运行脚本时出错,但在终端中运行脚本时不会出错

我正在尝试创建一个 RAM 磁盘,在系统启动时加载以前的内容,并每六个小时将内容写入磁盘映像。目前,当您从终端运行脚本(“sudo bash LogToRAM.sh”)时,一切正常。但在启动期间从 launchd 运行时,它不起作用。

以下是日志中的几行;第一行只是给出了我们在启动过程中所处位置的一些信息:


SecurityAgent[202] Showing Login Window 
com.mechcozmo.LogToRAM[51] + /Developer/usr/bin/SetFile -a V /Volumes/LogfileRAMdisk 
com.mechcozmo.LogToRAM[51] ERROR: File Not Found. (-43)  on file: /Volumes/LogfileRAMdisk  
com.mechcozmo.LogToRAM[51] + /usr/sbin/asr -source '/Library/Application Support/LogToRAM/RAMdisk_store.dmg' -target /Volumes/LogfileRAMdisk/ -noverify

这是有问题的脚本和 plist 文件。

请注意,脚本顶部有“set -vx”;它提供了大量有关脚本中正在发生的事情的信息。我目前的理论是 /Volumes 目录在启动过程的这个阶段不存在,但这似乎不太可能。

答案1

你知道 - 没错。我试过在 afp 上安装一个卷 - 但直到你登录后它才会起作用。不过我敢打赌你可以轻松地用“vol 存在吗?”来验证这一点(我忘了 shell 中它是什么)。

答案2

为了确认脚本运行时卷是否存在(这似乎是导致这些错误的最可能原因),请在顶部添加行以将当前活动卷的列表输出到 /tmp 或 /var/log 中的文件。

这些卷通常是在什么时候创建/安装的?
另外,您的脚本是在什么时候运行的?从 /etc/rc.local 运行?还是从 /etc/rc*.d 中的命令运行?

在不知道启动顺序的情况下进行一些猜测:

  • 如果卷通常在您登录时创建,则它们在启动时将不存在。您需要更改此设置,或者在登录时也运行缓存到 RAM 脚本。
  • 如果卷是在启动(登录前)过程中创建的,那么您可能只需要调整启动脚本的运行顺序。
  • 如果它们是出于某种原因需要一段时间才能安装的卷,并且它们是异步安装的,则可能需要修改脚本以在开始时有一个扫描和等待循环,以便等待它们出现。

答案3

当你尝试登录钩子(使用第一种方法,不要忘记sudo)?这有效吗?

登录钩子稍后加载,因此应该可以访问更多功能。

相关内容