无法从 crontab 作业进行 git 提交

Sha*_*mik 5 git shell cron git-commit

git commit我正在尝试使用 bash 脚本进行操作。我已经设置了一个 cron 作业来定期执行该脚本。如果我直接执行脚本,一切都会按预期进行。由于某种原因,当从 调用脚本时crontab,会git commit失败。这是脚本:

#!/bin/bash
cd /mnt/ebs2/sitemap
echo "Calling java application to generate sitemap"
java -jar SiteMap-1.0-jar-with-dependencies.jar -i sitemapconfig.xml -o /mnt/ebs2/sitemap/website_sitemaps -url ADSKContentURL
echo "sitemap generation complete.."
cd website_sitemaps
chmod 750 *
echo "Updated file permission, commiting to git..."
git commit -am 'automated weekly update'
git push -u
echo "git commit done..."
cd ..
Run Code Online (Sandbox Code Playgroud)

这是 crontab 的输出:

Calling java application to generate sitemap
sitemap generation complete..
Updated file permission, commiting to git...
/mnt/ebs2/sitemap/WeeklyUpdate.sh: line 10: git: command not found
/mnt/ebs2/sitemap/WeeklyUpdate.sh: line 11: git: command not found
git commit done...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它无法执行git commitand git push,而当直接运行脚本时,它就可以工作。

这是crontab条目。

0 2 * * 2 /bin/bash /mnt/ebs2/sitemap/WeeklyUpdate.sh
Run Code Online (Sandbox Code Playgroud)

我确保 crontab 和脚本都在 bash 中执行。我使用的是 CentOS 5.11。

任何指示将不胜感激。

-谢谢,

沙米克

********** 编辑解决方案 **************

基于@CholNhial和@Marc,crontab需要完整的git路径来执行命令。我已更新脚本以使用完整路径。

#!/bin/bash
cd /mnt/ebs2/aknsitemap
echo "Calling java application to generate sitemap"
java -jar ADSKSiteMap-1.0-jar-with-dependencies.jar -i sitemapconfig_Elvis.xml -o /mnt/ebs2/aknsitemap/aknwebsite_sitemaps -url ADSKContentURL
echo "sitemap generation complete.."
cd aknwebsite_sitemaps
chmod 750 *
echo "Updated file permission, commiting to git..."
/usr/local/bin/git commit -am 'automated weekly update'
/usr/local/bin/git push -u
echo "git commit done..."
cd ..
Run Code Online (Sandbox Code Playgroud)

小智 1

正如您从输出中看到的,这里的问题是当您的脚本运行时,它找不到您的git命令。您应该添加所有命令的完整路径。

当给 bash 一个命令时,它首先查找内置命令,然后开始检查 .bashrc 中的命令$PATH。假设如果您的脚本在直接从 shell 运行时运行,那么它在任何地方都会以相同的方式运行,这是一个常见且容易犯的错误,但事实并非如此。原因是,当您进入登录 shell 时,您会获得许多额外的内容作为环境的一部分。特别是,.bash_login通常在登录 shell 上执行。这使得运行命令更加方便,但这是你的 cron 作业所没有的奢侈。

与任何编程一样,最好不要对您的环境做太多额外的假设。如果您的脚本依赖于此,最好明确说明。这适用于任何命令的完整路径。

如果您需要从 shell 中找到命令的路径,您可以运行如下命令:

which git
Run Code Online (Sandbox Code Playgroud)

这将为您提供完整路径,然后您可以将其添加到脚本中。然后只需在脚本中替换git为即可。/your/full/path/to/git