我在彻底毁坏了一台 Linux 机器后问了这个问题。让我先介绍一下背景,这样你就知道我为什么这么说了。
我目前有(嗯……曾经有)一个运行 Apache 的 RedHat Linux 机器,其中添加了 Phusion Passenger,用于在 Apache 下运行 Ruby Apps。该应用程序充当定期向辛辛那提地区的自助服务终端提供缓存文件的服务。该 Web 应用程序运行良好,唯一剩下的部分就是设置一个 cron 任务来检索需要缓存的所有信息,并将其打包成几个不同的更新包,以提供给自助服务终端。为了实现这一点,我编写了一个 Ruby 脚本来处理数据的获取和打包。要设置 cron 任务,我只需使用内置的 crontab。脚本如下所示:
#!/bin/bash
cd ../lib
ruby pdf_cache.rb
ruby pdf_prepare.rb
ruby rss_cache.rb
ruby nightly-pack.rb
cd ..
chown -R www.www *
该脚本位于 cron 文件夹中,目录结构如下:
.
|-- cron
|-- feeds
|-- lib
| `-- trash
|-- logs
|-- nightly-packs
|-- pdf
| `-- tank
|-- public
`-- tmp
我运行了crontab -e
以下root
内容:
0 3 * * * /usr/local/apache2/ruby_projects/kiosk/cron/schedule_job
它应该每天凌晨 3 点执行脚本。安排此 cron 任务后的第二天,我得到了一个非常不幸的惊喜。cron 任务是在 root 中执行的,我认为大多数命令都失败了,除了将chmod -R www.www *
系统中所有内容的所有权更改为用户之外www
。
我的问题是:实现 cron 任务的正确方法是什么,cron 任务从什么上下文运行?我现在意识到我可能不应该在该root
帐户下运行它,而且我不确定如何在该www
帐户下运行它,因为该用户没有 shell,你无法成功地su
访问该www
用户。
答案1
我敢打赌,您只需给用户一个 shell,限制其远程访问能力和权限即可。
Cron 任务在创建 Cron 任务的用户下运行,所以它以 的身份运行root
。
答案2
另一个建议:-e
在脚本中添加类似这样的 shebang 行(即#!/bin/bash -e
)。如果脚本中的任何命令失败,这将使脚本退出。它不能保证您不会遇到任何不愉快的意外,但它可以防止脚本完全脱轨(可以这么说),并防止多种连锁反应故障。
答案3
正确的方法是“su - ”,以此用户身份设置您的 cronjob。然后它将以此用户身份运行。或者,根据您使用的 cron 守护程序,它可能有第 6 个字段来定义用户。
希望这能有所帮助。还有其他方法,但最好让它正常工作。