首页 > 系统相关 >linux: nohup & 重定向

linux: nohup & 重定向

时间:2024-03-20 18:12:45浏览次数:23  
标签:输出 重定向 错误 命令 xx nohup linux log

linux: nohup & 重定向

背景

今天在进行一些spark-hive​的操作时, 因为对此完全不了解, 所以找好兄弟咨询了下, 他给了我一串我完全看不懂的shell命令, 本文就是专门用来解释这个命令的

问题

  1. nohup​以及 >

代码

这段神奇的代码: nohup spark-hive -f xx.sql > xx.log 2>&1 &

解释

  1. nohup​:

    • nohup​ 是一个命令,它可以让你运行的程序在退出终端后继续运行。当你退出登录、关闭终端或断开SSH连接时,操作系统会向所有运行的程序发送一个SIGHUP信号,通常会导致程序终止。nohup​命令会阻止这个信号,让后续运行的程序忽略它,确保程序的持续运行。
  2. spark-hive​:

    • 这是启动Hive会话的命令,可能是一个自定义的脚本或别名,用于执行Hive查询。这里的假设是spark-hive​是利用Spark引擎执行Hive查询的命令。
  3. -f xx.sql​:

    • -f​ 参数代表 "file",xx.sql​ 是一个包含Hive SQL查询语句的文件。这个参数告诉spark-hive​命令读取该文件并执行文件中定义的SQL语句。
  4. >​:

    • 这个符号是输出重定向操作符,用于将命令的标准输出(通常显示在终端上的输出)重定向到一个文件上。
    • xx.log​ 是输出文件的名称。这意味着命令 spark-hive -f xx.sql​ 的标准输出(正常的输出)不会显示在终端上,而是会被写入到 xx.log​ 这个文件中。
  5. 2>&1​:

    • 这是一个特殊的重定向形式,用于将标准错误(stderr,即错误消息)重定向到标准输出(stdout,正常输出)。
    • 2​ 代表标准错误,1​ 代表标准输出。所以 2>&1​ 的意思是将错误信息也输出到xx.log​文件中,与正常的输出合并。
  6. &​:

    • 这个符号用于将命令置于后台执行。它让这个命令在子shell中运行,这意味着即使你的终端关闭,这个命令仍然在后台运行。
    • 这允许你继续在同一终端中运行其他命令,而该命令会在后台无干扰地运行。

总结一下,nohup spark-hive -f xx.sql > xx.log 2>&1 &​ 这个命令的作用是:

  • 无论终端是否关闭,都在后台安静地启动一个spark-hive​进程来运行xx.sql​文件中的Hive SQL语句。
  • 将所有的正常输出和错误输出都保存到xx.log​文件中,以供后续审查。

重定向的引申

  1. 进程替换:在一些Shell脚本中,你可以使用2>&1​与>(命令)​结合来实现进程替换,这能将标准输出和错误输出同时送入一个命令的标准输入中。例如:

    some_command 2>&1 | another_command
    
  2. 日志文件分割:虽然2>&1​将标准输出和错误输出合并到一个文件,但有时你可能想要分别处理。你可以先用2>&1​合并,然后用tee​命令分割它们,例如:

    some_command 2>&1 | tee logfile.log
    

    这样可以在屏幕上显示输出的同时,也将其写入日志文件。

  3. **错误输出的丢弃:如果你想忽略错误输出而只关心标准输出,可以将错误输出重定向到空设备/dev/null​:

    some_command > output.log 2>/dev/null
    
  4. 错误和输出的交换:有时你可能想要交换标准输出和错误输出的目的地,可以这样做:

    some_command 3>&1 1>&2 2>&3
    

    这里使用了文件描述符3作为临时的存储。

  5. 在脚本中动态处理错误**:你可以将错误输出重定向到一个管道中,并在管道的另一端动态处理这些错误:

    some_command 2> >(error_handling_command)
    

    这可以用于实时分析错误信息或将错误信息发送到某个日志服务。

  6. **使用exec批量处理文件描述符:在脚本开始处使用exec​命令可以为整个脚本的所有命令设置文件描述符的重定向,比如:

    exec 2>> error.log
    

    这样脚本中后续所有命令的错误输出都会追加到error.log​中。

  7. 在命令行中快速检查命令的成功与否:

    some_command 2>&1 >/dev/null | grep '错误关键词'
    

    如果some_command​产生了包含错误关键词​的错误输出,即使标准输出被重定向到/dev/null​,使用grep​也可以捕捉到错误信息。

  8. 调试脚本**:当编写复杂的Shell脚本时,你可能想要看到执行过程中的每个命令及其输出和错误,这时可以使用:

    set -x
    

    它会将执行的每个命令及其标准输出和错误输出打印到终端,这是一个很好的调试工具。

标签:输出,重定向,错误,命令,xx,nohup,linux,log
From: https://www.cnblogs.com/pDJJq/p/18085805/nohup-zkd9fo

相关文章

  • linux系统kubernetes的资源对象secret
    资源对象-secretSecret实现场景解释內建的Secrets创建自己的Secretsecret使用使用Secret加密流程创建secret加密数据挂载到pod容器以变量形式挂载以Volume数据卷形式挂载案例Secret实现作用:加密数据,存储在etcd中,让pod容器,以挂载Volume方式进行访问场景凭证......
  • linux系统kubernetes容器检查和恢复机制
    容器检查和恢复机制容器检查和恢复机制命令模式探针httpget方式探针POD的恢复策略容器检查和恢复机制在kubernetes中,可以为容器定义一个健康探针,kubelet就会根据这个Probe的返回值决定这个容器的状态,而不是直接以容器是否运行(来自Docker返回的信息)作为依据......
  • Linux进程控制
    1.进程创建fork函数#include<unistd.h>pid_tfork(void);返回值:自进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork代码后,内核做:1.分配新的内存块和内核数据结构给子进程2.将父进程部分数据结构内容拷贝至子......
  • 1、戴尔R630本地服务器搭建Linux系统软件硬件环境配置
    目录1.1、服务器配置1.1.1、选择服务器配置方案1.1.2、服务器硬件配置1.1.3、服务器配置检测1.2、网络配置1.2.1、外网配置1.2.2、内网配置1.3、Linux系统Centos镜像下载......
  • linux 中shell脚本中遇到 Runtime error (func=(main), adr=22): Divide by zero
    在Linux中编写Shell脚本时,遇到“Runtimeerror(func=(main),adr=22):Dividebyzero”这样的错误通常是因为在脚本中进行了除以零的操作,类似于编程语言中的除零错误。要解决这个问题,您需要检查Shell脚本中涉及到除法运算的地方,确保分母不为零。下面是一个示例S......
  • linux下InetAddress.getLocalHost()很慢10s
    问题原因:执行InetAddress.getLocalHost()方法的时候,根据系统名称去hosts文件里找匹配的ip发现找不到合适的IP,一直处于等待状态。解决办法:1、查看本机系统名称 2、编辑hosts文件,在其后补充“cenos1”     参考链接:https://blog.csdn.net/lijun169/article/detail......
  • Linux安装字体库
    Linux安装字体下载需要安装的字体①在Windows/Fonts路径下找到需要的字体,上传到需要安装字体的linux服务器查看linux有什么字体命令:fc-list 安装字体库命令:yum-yinstallfontconfig这时在/usr/share/目录就可以看到fonts和fontconfig目录了,本来就有说明已经安......
  • Linux系统的目录及重要文件
    [root@test/]#tree-L1>/home/text1.txt├──bin->usr/bin#所有二进制命令所在的目录(用户)├──boot#内核及引导系统程序所在的目录├──dev#所有设备文件的目录(如磁盘、光驱)├──etc#二进制安......
  • linux通过docker部署sock5的代理
    参考链接:https://appscross.com/2023/06/quickly-install-and-deploy-socks5-service/昨日研究单位的内网机器,如果通过家里的服务器能够ssh访问内网的服务器。无疑查到ssh的软件功能强大,后无聊转到了如何自己在服务器开启socks5代理。 这里我使用的是网上查的使用docker容器......
  • Linux环境运行python项目提示No module named '_ssl'
    版本python3.11.4控制台错误提醒File"/usr/local/python3/lib/python3.11/ssl.py",line100,in<module> import_ssl#ifwecan'timportit,lettheerrorpropagate ^^^^^^^^^^^ModuleNotFoundError:Nomodulenamed'_ssl'错误原因:ce......