【Linux系列】如何使用 nohup 命令在后台运行脚本
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
- 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- nohup 命令简介
- 基本用法
- 输出重定向
- & 符号的作用
- 后台进程的特点
- 注意事项
- 实际应用场景
- 长时间运行的任务
- 服务启动
- 定时任务
- 常见问题及解决方法
- nohup.out 文件权限问题
- 后台进程被意外终止
- 输出文件过大
在 Linux 或类 Unix 系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务。通过将脚本放到后台执行,用户可以继续使用终端进行其他操作,而不必担心脚本因为终端关闭或注销而中断。
nohup 命令简介
nohup
是一个命令行工具,用于防止命令因用户注销或终端关闭而被挂起。其名称来源于 “no hang up”,即不挂断。在 Unix 系统中,当用户注销或关闭终端时,会向正在运行的进程发送一个挂断信号(SIGHUP),导致进程终止。nohup
命令的作用就是让指定的命令忽略这个挂断信号,从而继续运行。
基本用法
nohup
的基本用法非常简单,只需将其放在要后台运行的命令前即可。例如,如果你有一个名为 start.sh
的脚本,想在后台运行它,并且不希望因为终端关闭而中断,可以使用以下命令:
nohup sh start.sh &
这里,sh start.sh
是要运行的脚本,&
符号表示将命令放到后台执行。nohup
会忽略挂断信号,确保脚本在后台持续运行。
输出重定向
默认情况下,nohup
会将命令的标准输出和标准错误输出到一个名为 nohup.out
的文件中,位于当前工作目录下。如果不想使用默认文件,可以通过重定向操作将输出指定到其他文件。例如:
nohup sh start.sh > start.log 2>&1 &
>
是一个 shell 命令,用于将命令的输出重定向到文件。start.log
是指定的输出文件名,所有标准输出都会被写入这个文件。2>&1
是一个特殊的重定向操作,表示将标准错误(文件描述符为 2)重定向到标准输出(文件描述符为 1),这样错误信息也会被写入start.log
文件中。&
符号将整个命令放到后台执行。
通过这种方式,你可以清晰地查看脚本的运行日志,而不会因为终端关闭或注销而丢失输出信息。
& 符号的作用
&
符号在 shell 命令中用于将命令放到后台执行。当在命令末尾加上 &
时,shell 会创建一个新的子进程来运行该命令,同时返回到命令提示符,允许用户继续在终端输入其他命令。
后台进程的特点
- 后台进程不会阻塞终端,用户可以继续使用终端进行其他操作。
- 后台进程可以通过
jobs
命令查看,使用fg
命令将其带回前台,或使用kill
命令终止它。 - 如果终端关闭,后台进程通常会收到挂断信号(SIGHUP),除非使用了
nohup
命令。
注意事项
- 当使用
&
将命令放到后台执行时,如果命令依赖于前台进程的某些资源(如标准输入),可能会出现问题。因此,在使用&
时,通常需要对命令的输入输出进行适当的处理。 - 后台进程的优先级通常较低,系统会根据调度算法动态调整其运行优先级,以保证系统的整体性能。
实际应用场景
长时间运行的任务
对于一些需要长时间运行的任务,如数据备份、大规模文件处理、复杂计算等,使用 nohup
命令结合 &
符号可以在后台运行相关脚本,避免因终端关闭或注销而导致任务中断。例如,一个数据备份脚本 backup.sh
可以这样运行:
nohup sh backup.sh > backup.log 2>&1 &
这样,备份任务会在后台执行,所有的输出信息都会被记录到 backup.log
文件中,方便后续查看和分析。
服务启动
在启动一些服务时,也需要将其放到后台运行。例如,启动一个 Web 服务的脚本 start_web.sh
可以使用以下命令:
nohup sh start_web.sh > web.log 2>&1 &
这样,Web 服务会在后台启动,所有的日志信息都会被写入 web.log
文件中,方便监控服务的运行状态。
定时任务
对于一些定时任务,虽然通常使用 cron 作业来实现,但在某些情况下,也可以通过脚本结合 nohup
命令来完成。例如,一个每天定时清理日志的脚本 clean_logs.sh
可以这样运行:
nohup sh clean_logs.sh > clean_logs.log 2>&1 &
通过将这个命令放入定时执行的脚本中,可以确保日志清理任务在后台自动运行,不会因为终端关闭或注销而中断。
常见问题及解决方法
nohup.out 文件权限问题
在某些情况下,nohup
默认生成的 nohup.out
文件可能会因为权限问题导致无法写入。解决方法是提前创建一个具有适当权限的输出文件,然后将输出重定向到该文件。例如:
touch output.log
chmod 644 output.log
nohup sh start.sh > output.log 2>&1 &
后台进程被意外终止
如果后台进程被意外终止,可能是由于系统资源不足、进程被杀掉等原因。解决方法是检查系统资源使用情况,确保有足够的资源供进程运行;同时,可以通过 ps
命令查看进程状态,使用 kill
命令手动终止进程时要谨慎操作,避免误杀重要进程。
输出文件过大
长时间运行的脚本可能会产生大量的输出信息,导致输出文件过大。解决方法是定期检查输出文件大小,并根据需要进行清理或分割。可以使用 logrotate
工具来管理日志文件的轮转、压缩和删除等操作,保持输出文件在一个合理的大小范围内。
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙