参考资料
- linux后台运行nohup命令的使用及2>&1字符详解
目录
- 前期准备
- 一. 基本语法
- 二. 执行时不指定日志文件
- 三. 执行后不想要日志文件
- 四. nohup命令的执行与kill
- 4.1 执行
- 4.2 kill
前期准备
📄handle_file.sh
#!/bin/bash
echo "文件复制开始..."
# 使脚本睡眠10秒中,模拟文件复制耗时操作...
sleep 120
echo "文件复制结束..."
一. 基本语法
nohup
命令可以确保即使终端会话结束,输入的命令也能够持续运行。
常见的应用场景包括长时间运行的任务,如备份、数据处理等。
例如当我们执行一个备份命令需要花费10个小时,我们不需要一直守在电脑上等待备份完成,完全可以在终端上执行完命令之后,直接关掉终端做别的时候,然后第二天再来确认备份是否完成。
nohup 命令 [参数] &
&
:表示将命令放在后台执行。> result.log
:将脚本的执行结果输出到result.log这个文件中2>&1
:是一个整体,>
左右不能有空格,即将错误内容重定向输入到标准输出中去。
相当于将handle_file.sh脚本执行过程中出现的错误输出到result.log文件中。0
表示stdin标准输入,用户键盘输入的内容1
表示stdout标准输出,输出到显示屏的内容2
表示stderr标准错误,报错的内容
/dev/null
:此处的作用只是为了避免nohup: ignoring input这个提示消息被添加到result.log文件中,该消息的产生并不影响程序执行,该配置项加不加无所谓。
# 如果sh脚本有执行权限的执行方法
nohup ./handle_file.sh > result.log 2>&1 < /dev/null &
# 如果sh脚本没有执行权限的执行方法
nohup sh ./handle_file.sh > result.log 2>&1 < /dev/null &
二. 执行时不指定日志文件
- 若不指定具体的日志文件,默认会在当前所在路径下产生一个
nohup.out
文件用来存放执行过程中的日志。
nohup sh ./handle_file.sh &
三. 执行后不想要日志文件
- 若执行过程中不想要日志,可以把正常输出和错误都放到
/dev/null
中进行销毁 /dev/null
是一个特殊的设备文件,在 Linux 和类 Unix 系统中用于丢弃数据。
当将输出重定向到/dev/null
时,数据实际上不会被写入到任何地方,而是被丢弃。
因为/dev/null
文件不会保存数据,也不会产生任何输出。
nohup sh ./handle_file.sh > /dev/null 2>&1 &
四. nohup命令的执行与kill
4.1 执行
- 执行之后可以看到sh脚本的线程号,本案例中,线程号为 7051
- 执行之后还可以通过
ps -ef | grep "脚本名"
来查询在后台的状况 - 因为我们在sh脚本中设置了线程睡眠,因此刚执行完之后,立马查看result.log内容只有一行
nohup sh ./handle_file.sh > result.log 2>&1 < /dev/null &
4.2 kill
⏹如果脚本执行之后很长时间还是没有执行完,可以通过kill命令杀死脚本线程,强制结束
语法
kill -9 要杀死的线程PID