如何通过launchd运行TypeScript脚本?已找到npx路径
解决launchd运行TypeScript脚本时找不到node的问题
问题分析
直接在终端执行/usr/local/bin/npx ts-node /path/to/script.ts可正常运行,但通过launchd的plist配置执行时,进程退出码为127,日志报错env: node: No such file or directory。核心原因是launchd的运行环境PATH变量与终端不同,导致npx无法定位到node的可执行文件路径。
解决方案
方案1:在plist中配置完整PATH环境变量
- 先通过
type node命令获取node的绝对路径(例如/usr/local/bin/node或Apple Silicon Mac的/opt/homebrew/bin/node) - 在plist中添加
EnvironmentVariables键,确保PATH包含node所在目录:
<key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> <!-- Apple Silicon设备请改为:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin --> </dict>
完整plist示例:
<?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.your.script.identifier</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/npx</string> <string>ts-node</string> <string>/path/to/script.ts</string> </array> <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> </dict> <key>RunAtLoad</key> <true/> <key>StandardOutPath</key> <string>/var/log/script-output.log</string> <key>StandardErrorPath</key> <string>/var/log/script-error.log</string> </dict> </plist>
方案2:通过npx的--node-path参数指定node路径
直接在ProgramArguments中添加参数,明确指定node的绝对路径:
<key>ProgramArguments</key> <array> <string>/usr/local/bin/npx</string> <string>--node-path</string> <string>/usr/local/bin/node</string> <!-- 替换为你的node实际路径 --> <string>ts-node</string> <string>/path/to/script.ts</string> </array>
方案3:直接用node启动ts-node
- 通过
type ts-node获取ts-node的绝对路径(例如/usr/local/bin/ts-node) - 直接用node的绝对路径运行ts-node:
<key>ProgramArguments</key> <array> <string>/usr/local/bin/node</string> <string>/usr/local/bin/ts-node</string> <string>/path/to/script.ts</string> </array>
验证配置
修改plist后,执行以下命令重新加载并验证:
# 卸载已加载的配置(如果存在) launchctl unload ~/Library/LaunchAgents/com.your.script.identifier.plist # 加载新配置 launchctl load ~/Library/LaunchAgents/com.your.script.identifier.plist # 查看进程状态 launchctl list | grep com.your.script.identifier
内容的提问来源于stack exchange,提问作者Ben Robinson
相关产品推荐
相关产品推荐

