2

我编写了一个脚本,以便在 crontab 上重新启动时自动运行

这是我的配置crontab -e

@reboot /home/deploy/startup_script >> /home/deploy/startup_script.log 2>$1

这将启动脚本并创建登录/home/deploy

那么这是startup_script

#!/bin/bash

echo "Changing directory"
cd /home/deploy/source/myapp
echo $PWD

echo "Pulling Dev Branch..."
git pull origin dev_branch

echo "Running Bundle Install"
sudo gem install bundler
bundle install

echo "Deploying to Staging..."
bundle exec cap staging deploy

当我使用它手动运行此脚本./startup_script时,它会正常运行,但是当我在 crontab 中自动运行它时,bundle command not found即使我已经安装了捆绑器,它也能正常运行。

这是来自的日志startup_script.log

Changing directory
/home/deploy/source/myapp
Pulling Dev Branch...
From ssh://1.xx.xx.xx.io:20194/xx/myapp
 * branch            dev_branch -> FETCH_HEAD
Already up-to-date.
Running Bundle Install
Successfully installed bundler-2.0.2
Parsing documentation for bundler-2.0.2
Done installing documentation for bundler after 5 seconds
1 gem installed
/home/deploy/startup_script: line 12: bundle: command not found
Deploying to Staging...
/home/deploy/startup_script: line 15: bundle: command not found
4

3 回答 3

2

cron 经常清除整个环境,包括这个$PATH变量。因此,与 shell 中的行为相比,脚本在您的 cron 中的行为可能会有所不同。为了避免输入命令的绝对路径,shell 引入了$PATH环境变量,每个目录由 : 分隔,搜索从左到右进行。

选项一:您可以使用绝对路径:

以 sudoer 运行 which bundle 以获取 bundle 命令的完整路径。如果输出为/usr/bin/bundle,则脚本中的 bundle 命令将如下所示:

/usr/bin/bundle install

选项二:设置 PATH 变量:

以运行此脚本的用户身份运行 echo " $PATH" 以获取$PATH变量并确保此变量在您的 cron 脚本中也可用。例如,如果输出是/usr/local/bin:/usr/bin:/bin,您可以将下面的行放在 shell 脚本的顶部:

export PATH="/usr/local/bin:/usr/bin:/bin"
于 2019-08-30T08:18:28.577 回答
0
  1. 重定向stderrstdout,应该有2>&1
  2. 安装包的路径gem是否添加到$PATH变量中?尝试提供此脚本的完整路径
  3. 我建议你做一个条目,看看你有哪些环境变量crontab
    * * * * * printenv > ~/printenv.log
    
于 2019-08-30T07:49:46.640 回答
0

您的 crontab 使用的环境将与您的常规登录 shell 不同。

现在,我对此可能是错的,但我认为当 crontab 执行时,它不是登录 shell,所以它没有任何你添加到你的路径中的.bashrc.bash_profile.

这里的最佳做法是使用可执行文件的完整路径bundle

于 2019-08-30T07:45:11.877 回答