【问题标题】:JENKINS -- sleep: command not found詹金斯——睡眠:找不到命令
【发布时间】:2020-07-24 04:45:23
【问题描述】:

我想通过延迟每 5 秒在 Jenkins 上运行一个 shell 命令。以下是命令:

cd /cygdrive/c/path/project_name

./scheduler.sh &

scheduler.sh 中是:

#!/bin/sh
sleep="/bin/sleep"
(sleep 5 && ./to_run.sh) &
(sleep 10 && ./to_run.sh) & 
(sleep 15 && ./to_run.sh) &
(sleep 20 && ./to_run.sh) & 
(sleep 25 && ./to_run.sh) &
(sleep 30 && ./to_run.sh) & 
(sleep 35 && ./to_run.sh) & 
(sleep 40 && ./to_run.sh) & 
(sleep 45 && ./to_run.sh) & 
(sleep 50 && ./to_run.sh) & 
(sleep 55 && ./to_run.sh) & 
(sleep 60 && ./to_run.sh) &

它将每 5 秒运行一次to_run.shto_run.sh 包含运行 python 项目的脚本:

#!/bin/bash

PATH="$PATH;$PYTHON_PATH"

/cygdrive/c/path/venv/Scripts/activate & cd /cygdrive/c/path/project_name& python whatever.py runserver

echo "SUCCESS RUN ALL PYTHON SCRIPTS!"

但是,即使构建成功,我也会从 Jenkins 那里收到此错误:

Started by timer
Running as SYSTEM
Building in workspace C:\Program Files (x86)\Jenkins\workspace\Oncore temp table
$ C:\cygwin64\bin\cygpath -w C:\cygwin64\bin\sh
[Oncore temp table] $ C:\cygwin64\bin\sh.exe -xe C:\WINDOWS\TEMP\jenkins4700784491498255011.sh
+ cd /cygdrive/c/path/project_name
+ ./scheduler.sh
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
./scheduler.sh: line 3: sleep: command not found
Finished: SUCCESS

我已经在 J​​enkins 上设置了 cygwin:

请帮忙!

【问题讨论】:

  • 您的 PATH 似乎不包括 /usr/bin。要么修复此问题 (PATH=/usr/bin:$PATH),要么通过 /usr/bin/sleep 显式调用 sleep。顺便说一句,您还分配了一个名为 sleepshell 变量,您从不使用它。这是故意的吗?
  • @user1934428 我在回答中提到了未使用的$sleep shell 变量。

标签: shell jenkins cygwin


【解决方案1】:

这个:

PATH="$PATH;$PYTHON_PATH"

$PYTHON_PATH 附加到您的$PATH,但它使用分号作为分隔符。在 Cygwin 上,sleep 位于 /usr/bin/bin 中(它们实际上是同一个目录),并且在您运行命令的环境中,其中一个可能是您的 $PATH 中的最后一个目录。所以$PATH 的最后一个元素可能类似于/usr/bin;/your/python/path,它不存在。

Cygwin 与 Unix 或 Linux 一样,使用冒号而不是分号分隔 $PATH 的元素。 (我知道 Windows 使用分号;Cygwin 对你隐藏了。)试试这个:

PATH="$PATH:$PYTHON_PATH"

还有,这个:

sleep="/bin/sleep"
(sleep 5 && ./to_run.sh) &

将名为$sleep 的shell 变量设置为/bin/sleep,但这并不能使其成为命令名称。 sleep 5 仍然在你的 $PATH 中搜索 sleep 命令(你已经搞砸了)。

通常/bin/usr/bin 已经在您的$PATH 中,因此只需直接调用sleep 5,它就会找到它。删除sleep="/bin/sleep" 行;没必要。

但是,如果您确实想指定sleep 命令的位置,则需要使用shell 函数或别名,而不是变量设置。例如,您可以这样做:

alias sleep=/bin/sleep
sleep 5

但正如我所说,它不应该是必要的。

顺便说一句,每 5 秒运行一次命令的更简单方法是:

for i in {1..12} ; do
    sleep 5
    ./to_run.sh &
done

【讨论】:

  • 我将; 更改为: 并使用for 循环解决方案。我仍然遇到同样的错误。找不到睡眠命令
  • /bin/sleep 属于coreutils-8.26-2 包,应该默认安装,因为它属于Base 类别
  • 我在前面添加了alias,它成功了。但现在我得到python cmd not found。我已经设置了 PYTHON_PATH ......我还做错了什么
  • @xixi 更新前$PATH 的值是多少?您应该能够直接调用sleep,而无需使用别名、变量或函数。我认为你的$PATH 有什么东西搞砸了。