我想让 crontab 以普通用户身份运行此脚本:
#!/usr/bin/env bash
PIDFILE=wp-content/uploads/sphinx/var/log/searchd.pid
if ! test -f ${PIDFILE} || ! kill -s 0 `cat ${PIDFILE}`; then
`which searchd` --config /home/user/www/wordpress-page/wp-content/uploads/sphinx/sphinx.conf
fi
它只是重新运行 Sphinx Search 守护进程,因为如果任何内存超过 1GB(其 Webfaction),我的共享服务器就会杀死所有守护进程。
当我通过 CLI 命令手动调用该脚本时,它可以工作,但如果我将其附加到 crontab 中(使用crontab -e
),我会收到一封包含错误的电子邮件
which: no searchd in (/usr/bin:/bin)
/home/user/www/wordpress-page/run-searchd.sh: line 8: --config: command not found
简单地说,它搜索根级别,但我希望当我以普通用户身份通过 ssh 登录时,它的行为就像我自己调用的那样。如何做到这一点?
答案1
这可能是因为$PATH
.在您的 shell 之外执行此操作crontab
:
command -v searchd | xargs dirname
此命令将返回系统上的目录,或者如果您甚至在交互式 shell 中searchd
没有该目录,则会返回错误。现在在您执行的脚本的顶部执行此操作:searchd
$PATH
crontab
PATH=<directory_from_above_command>:$PATH
或者只使用完整路径searchd
而不是which searchd
.
which
如果您想完全了解它的工作原理,请继续阅读以下内容:为什么不用“哪个”呢?那该用什么呢?。
答案2
直接使用就可以了searchid
。如果which
能找到它,它已经在你的里面了$PATH
,所以没有必要which
在这里使用。
如果您希望确保能够执行它,请使用该实用程序及其完整绝对路径。
另请参阅问题为什么不用“哪个”呢?那该用什么呢?(关于which
一般情况)。