git - 无法从 crontab 作业中提交 git

标签 git shell crontab git-commit

我正在尝试使用 bash 脚本执行 git commit。 我已经设置了一个 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 ..

这是 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...

可以看到,git commitgit push执行失败,直接运行脚本就可以了。

这是 crontab 条目。

0 2 * * 2 /bin/bash /mnt/ebs2/sitemap/WeeklyUpdate.sh

我正在确保 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 ..

最佳答案

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

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

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

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

which git

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

关于git - 无法从 crontab 作业中提交 git,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600993/

相关文章:

每 10 分钟执行一次 php cron 作业

windows - 关于Windows上插件失败的 Gradle

git - 更新**不是**当前分支(在 Git 中)

linux - 如何使用 shell 命令读取和更新(递增)文件中的值

bash - 在脚本中通过 ssh 使用反引号 (`)

linux - 为什么双引号会改变结果

git - 是否有一个 git log 参数来过滤只有大变化的文件?

android - 使用 Ant 获取存储库提交消息以更新使用 VSTS 或 Bitrise 构建的 Crashlytics Beta 发行说明

linux - 使用用户输入运行 crontab

php - 将 cron 配置为每 15 分钟运行一次 URL