如何帮助 AWS EC2 crontab 找到包?

如何帮助 AWS EC2 crontab 找到包?

我是 AWS 和 Linux 新手。我刚刚设置了我的第一个 AWS EC2 实例(Amazon Linux 2 AMI (HVM)),使用 scp 将一个简单的 Python 项目传输到该实例,使用 ssh 连接到该实例,安装了 Python3、pip、pipenv 和项目依赖项,然后运行项目。一切都按预期进行。然后我向项目添加了一个 crontab:

*/5 * * * * cd my_project && pipenv run python3 test.py

过了一会儿,我在命令行中收到一条消息。

You have new mail in /var/spool/mail/ec2-user

消息是这样的:

/bin/sh: pipenv: command not found

来自另一篇文章:...cron doesn't have the same environment ie $PATH as the user entering the cron script data.我不太清楚这意味着什么或如何解决这种情况。我尝试查看 /bin/sh 文件,看看是否可以向其中添加 pipelinev,但里面很混乱,不是人类可读的。

我以前which pipenv查过pipenv安装在哪里,得到的路径是~/.local/bin/pipenv.如果我尝试 cd 进入该目录,我会得到:-bash: cd: /home/ec2-user/.local/bin/pipenv: Not a directory。如果我cd /binls,我看到这里安装了Python3和pip,但没有安装pipenv。可能值得一提的是,我用 yum 安装了 Python3 和 pip,但用 pip 安装了 pipelinev。

对于一个或多或少完整的 Linux 新手来说,任何关于这里发生的事情的见解都将非常感激。

编辑:发布后不久,我发现了这个......


cron runs your command in a restricted environment.

What environment variables are available is likely to be very limited. Typically, you'll only get a few variables defined, such as $LOGNAME, $HOME, and $PATH.

Of particular note is the PATH is restricted to /bin:/usr/bin. The vast majority of "my cron script doesn't work" problems are caused by this restrictive path. If your command is in a different location you can solve this in a couple of ways:

    Provide the full path to your command.

    1 2 * * * /path/to/your/command

    Provide a suitable PATH in the crontab file

    PATH=/bin:/usr/bin:/path/to/something/else
    1 2 * * * command 

看起来我要么需要安装 Pipenv,/usr/bin要么告诉 cron 在哪里可以找到 Pipenv。我绝对不知道如何做前者,虽然我知道 Pipenv 的路径,如前所述,但当我尝试去那里时,我收到一条消息说它不存在,所以我不知道如何要么做后者。

答案1

您收到directory not found错误是因为您尝试cd进入文件而不是目录。cd /home/ec2-user/.local/bin/pipenv使用 thiscd /home/ec2-user/.local/bin/和 thenls -l或 this代替 this: ls -l /home/ec2-user/.local/bin/pipenv,您就会看到它。

在您的 crontab 中,使用以下任一选项:

*/5 * * * * cd my_project && /home/ec2-user/.local/bin/pipenv run /usr/bin/python3 test.py

-------------------------------------------

PATH=/usr/bin:/home/ec2-user/.local/bin

*/5 * * * * cd my_project && pipenv run python3 test.py

确保最后一行之后有一个新行。

相关内容