Linux crontab——我使用的是哪个 shell

Linux crontab——我使用的是哪个 shell

在 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/shelltestshell 的文件名。如果您的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> 标识的进程的可执行文件的链接。
  • (可能有更简洁的方法来做同样的事情,这是凭记忆输入的,欢迎通过评论提出建议!)

相关内容