在 crontab 中,我如何知道它正在使用哪个 shell?
例如,如果我想重定向输出,我如何知道是否需要使用 &> 或 >& (bash 与 csh)
答案1
从crontab(5)
:
几个环境变量由 cron(8) 守护进程自动设置。 SHELL 设置为 /bin/sh,LOGNAME 和 HOME 从 crontab 所有者的 /etc/passwd 行设置。 HOME 和 SHELL 可以通过 crontab 中的设置覆盖; LOGNAME 不能。
答案2
这取决于您拥有的版本cron
以及配置方式,但通常是/bin/sh
.虽然这通常是指向其他内容的符号链接,但很容易找到,因为您只需运行ls -l /bin/sh
.
您可以添加一个 cron 条目,例如:
* * * * * ps -p $$ > /tmp/shelltest
或者(如果进行编辑/etc/crontab
而不是像通过 那样向每个用户的 crontab 添加条目crontab -e
):
* * * * * username ps -p $$ > /tmp/shelltest
它会通过输出告诉您/tmp/shelltest
shell 的文件名。如果您的cron
设置正确,可以将输出邮寄给您,那么您可以跳过>/tmp/shelltest
通过邮件获取信息,而不是将其放入文件中。
更复杂一些,比如:
* * * * * ls -l /proc/`ps -p $$ | tail -n 1 | xargs | cut -f 1 -d \ `/exe > /tmp/shelltest
应该告诉你所使用的确切文件。在典型的 Debian 系统上,这将导致如下结果:
lrwxrwxrwx 1 dspillett dspillett 0 Mar 14 16:17 /proc/1356/exe -> /bin/dash
显示 crondash
在此实例中用作默认 shell。
要分解该命令:
ps -p $$
输出当前进程(也ps
就是 的父进程)的详细信息,在本例中它将是 shell。tail -n 1
去掉ps
包含的标题行- 管道通过
xargs
是修剪行中前导空格的技巧 - 调用
cut
从类似的第一个字段中获取分隔符是空格的字段(在 \ 和反引号之间包含空格绝对重要) - 将其包装在反引号中,包括外部命令行中的输出(应该是进程 ID),这将成为...
ls -l /proc/9999/exe
其中“9999”是读取的进程 ID,ps
其中列出了用于创建该进程的文件,因为在 '/proc' 文件系统中/proc/<pid>/exe
有一个指向由 <pid> 标识的进程的可执行文件的链接。- (可能有更简洁的方法来做同样的事情,这是凭记忆输入的,欢迎通过评论提出建议!)