我是 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 /bin
和ls
,我看到这里安装了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
确保最后一行之后有一个新行。