【问题标题】:mvn clean works fine in terminal but not from cron and bash filemvn clean 在终端中可以正常工作,但不能来自 cron 和 bash 文件
【发布时间】:2019-10-26 13:02:39
【问题描述】:

mvn clean 在终端上可以正常工作。即使我通过双击从 bash 文件(.sh 文件)执行相同的操作,它也可以正常工作。

但是当我使用 crontab 触发相同的操作时,我收到错误 mvn:command not found

bash(.sh) 文件有这个代码

#!/bin/bash 
cd /Users/testautomation/Documents/Automation/TFS/Mem_Mobile 
mvn clean

crontab -l 的输出

0 14 * * * /Users/testautomation/Documents/Automation/Schedule/Execute.sh

错误

From testautomation@Tests-iMac.xxx.local  Wed Jun 12 14:44:01 2019
Return-Path: <testautomation@Tests-iMac.xxx.local>
X-Original-To: testautomation
Delivered-To: testautomation@Tests-iMac.xxx.local
Received: by Tests-iMac.xxx.local (Postfix, from userid 501)
id 0BE233001CB411; Wed, 12 Jun 2019 14:44:00 +1000 (AEST)
From: testautomation@Tests-iMac.xxx.local (Cron Daemon)
To: testautomation@Tests-iMac.xxx.local
Subject: Cron <testautomation@Tests-iMac> /Users/testautomation/Documents/Automation/Schedule/Execute.sh
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=testautomation>
X-Cron-Env: <USER=testautomation>
X-Cron-Env: <HOME=/Users/testautomation>
Message-Id: <20190612044401.0BE233001CB411@Tests-iMac.xxx.local>
Date: Wed, 12 Jun 2019 14:44:00 +1000 (AEST)

/Users/testautomation/Documents/Automation/Schedule/Execute.sh: line 3: mvn: command not found

我已经使用自制软件安装了 maven。

mvn -version 输出:

Tests-iMac:~ testautomation$ mvn -version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T06:00:29+11:00)
Maven home: /usr/local/Cellar/maven/3.6.1/libexec
Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre
Default locale: en_AU, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.5", arch: "x86_64", family: "Mac"

【问题讨论】:

  • 开始使用像 Jenkins 这样可以处理此类事情的 CI 解决方案...

标签: bash macos maven cron


【解决方案1】:

在执行脚本时使用 mvn 的完整路径。

#!/bin/bash 
cd /Users/testautomation/Documents/Automation/TFS/Mem_Mobile 
/usr/local/Cellar/maven/3.6.1/bin/mvn clean

或者下面的脚本也应该可以工作

#!/bin/bash 
cd /Users/testautomation/Documents/Automation/TFS/Mem_Mobile 
/usr/local/bin/mvn clean

【讨论】:

  • 感谢@nagendra547 .. 它立即开始工作...:)
【解决方案2】:

作为in here,您可能需要添加环境变量(MAVEN_HOME)并完成PATH(使用mvn

或者至少在您的 script.sh 中做同样的事情,这意味着不要假设您会在 cron 会话中继承所有用户会话环境。

【讨论】:

    【解决方案3】:

    Cron 运行 non-ineractive and non-login shell

    0 14 * * * . $HOME/.profile; /Users/testautomation/Documents/Automation/Schedule/Execute.sh
    

    如果您使用更多 shell 配置文件变量扩展您的 shell 脚本,上述命令非常适合。加载 bash 配置文件会更新 env 变量,包括 PATH 变量以包含 mvns 路径 (主要是在 mvn 安装期间添加到其中)

    .source 的同义词。

    Crontab 在非常有限的 shell 环境中运行。设置了一些变量,例如 HOME、LOGNAME 和 SHELL。这就是为什么我们可以使用 $HOME 来调用相应的配置文件。

    PATH 应该包含您的 mvn 二进制文件的位置,但仅限于 cron env 中的主要二进制文件路径;因此,您的 mvn 二进制文件的绝对路径如前所述。

    【讨论】:

      【解决方案4】:

      一个不错的方法是将 mvn 的路径声明为字符串值,并使用 "$val" 调用它:

      mvn="path\to\mvn" --等号附近没有空格

      然后调用“$mvn”

      【讨论】:

      • 我不得不这样做,因为我的 mvn 没有安装在操作系统路径中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多