![启动时通过 launchd 运行脚本时出错,但在终端中运行脚本时不会出错](https://linux22.com/image/489498/%E5%90%AF%E5%8A%A8%E6%97%B6%E9%80%9A%E8%BF%87%20launchd%20%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E6%97%B6%E5%87%BA%E9%94%99%EF%BC%8C%E4%BD%86%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E6%97%B6%E4%B8%8D%E4%BC%9A%E5%87%BA%E9%94%99.png)
我正在尝试创建一个 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
请注意,脚本顶部有“set -vx”;它提供了大量有关脚本中正在发生的事情的信息。我目前的理论是 /Volumes 目录在启动过程的这个阶段不存在,但这似乎不太可能。
答案1
你知道 - 没错。我试过在 afp 上安装一个卷 - 但直到你登录后它才会起作用。不过我敢打赌你可以轻松地用“vol 存在吗?”来验证这一点(我忘了 shell 中它是什么)。
答案2
为了确认脚本运行时卷是否存在(这似乎是导致这些错误的最可能原因),请在顶部添加行以将当前活动卷的列表输出到 /tmp 或 /var/log 中的文件。
这些卷通常是在什么时候创建/安装的?
另外,您的脚本是在什么时候运行的?从 /etc/rc.local 运行?还是从 /etc/rc*.d 中的命令运行?
在不知道启动顺序的情况下进行一些猜测:
- 如果卷通常在您登录时创建,则它们在启动时将不存在。您需要更改此设置,或者在登录时也运行缓存到 RAM 脚本。
- 如果卷是在启动(登录前)过程中创建的,那么您可能只需要调整启动脚本的运行顺序。
- 如果它们是出于某种原因需要一段时间才能安装的卷,并且它们是异步安装的,则可能需要修改脚本以在开始时有一个扫描和等待循环,以便等待它们出现。
答案3
当你尝试登录钩子(使用第一种方法,不要忘记sudo
)?这有效吗?
登录钩子稍后加载,因此应该可以访问更多功能。