通过Cron调用Shell脚本运行DotNet程序失败求助
这个问题我之前也碰到过,核心原因是Cron的环境变量PATH和你终端里的PATH不一样。从你提供的日志能看到,Cron使用的PATH是/usr/bin:/bin,但dotnet的可执行文件路径大概率不在这个列表里——而你在终端直接运行时,你的用户环境已经把dotnet的路径加到PATH里了,所以完全没问题。
下面给你几个靠谱的解决办法,按推荐程度排序:
1. 在脚本里使用dotnet的绝对路径
这是最直接也最不容易出问题的方法。先在终端里执行which dotnet,得到dotnet的绝对路径,比如可能是/usr/local/dotnet/dotnet或者/opt/dotnet/dotnet。
然后把你脚本里的dotnet app.name.dll改成绝对路径的形式:
/usr/local/dotnet/dotnet app.name.dll
这样不管Cron的PATH是什么,都能准确找到dotnet命令。
2. 在脚本开头添加dotnet的路径到PATH里
如果你不想写长路径,可以在脚本的开头(比如第1行或第2行)添加一行,把dotnet所在的目录加到PATH中:
PATH=$PATH:/usr/local/dotnet # 这里替换成你实际的dotnet所在目录
同样,先通过which dotnet找到目录,比如which dotnet返回/usr/local/dotnet/dotnet,那目录就是/usr/local/dotnet。
3. 在Crontab配置里设置全局PATH
打开你的crontab配置(crontab -e),在所有定时任务的上方添加一行,设置包含dotnet路径的PATH:
PATH=/usr/bin:/bin:/usr/local/dotnet # 把dotnet的目录加到后面
这样所有Cron任务都会使用这个PATH,适合有多个脚本需要用到dotnet的场景。
最后验证一下,修改完之后可以手动触发Cron任务测试(或者等下一次定时执行),应该就不会再出现dotnet: command not found的错误了。
内容的提问来源于stack exchange,提问作者dandash simon

