我正在尝试使用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 commit
和git push
,这在脚本直接运行时有效。
这是crontab
条目。
0 2 * * 2 /bin/bash /mnt/ebs2/sitemap/WeeklyUpdate.sh
我确保crontab和脚本都是用bash执行的。 我正在使用CentOS 5.11。
任何指针都将受到赞赏。
-Thanks,
Shamik
************编辑解决方案**************
基于@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 ..
答案 0 :(得分:0)
从输出中可以看到,这里的问题是,脚本在运行时找不到git
命令。您应该将完整路径添加到所有命令。
给bash命令后,它将首先查找内置命令,然后开始在$PATH
中检查命令的bash。一个常见且容易犯的错误是,假设当您直接从shell运行脚本时,该脚本将在任何地方运行,但事实并非如此。原因是,当您输入登录shell时,您会在环境中获得很多额外的东西。特别是,.bash_login
通常在登录Shell上执行。这使运行命令更加方便,但这是您的cron作业所无法比拟的。
与任何编程一样,最好不要对您的环境进行任何其他假设。如果脚本依赖于此,则最好进行明确声明。这适用于任何命令的完整路径。
如果需要从外壳中找到命令的路径,则可以运行以下命令:
which git
这应该为您提供完整的路径,然后您可以将其添加到脚本中。然后只需在脚本中将git
替换为/your/full/path/to/git
。