linux中nohup和&的用法
在linux下写命令,或者使用shell脚本时,当我们遇到一个可能很耗时的命令时,比如删除大量文件,我们往往希望这个命令放到后台去执行,而不是在前台阻塞着,这时候,我们很可能会看到这样的代码:nohup rm -rf /test &,都是放到后台去运行,有什么区别呢?
想想,我们现在一般是这么使用linux,通过xshell等工具,开启一个shell终端,然后在这个shell上写命令,这个时候,当我们执行一个很耗时的命令时,我们不想让它占用我们的shell,我们后续还想继续执行其它命令,你可以在这个命令后面加一个&,意思就是把这个命令放到后台执行,让当前命令可以继续写命令执行,但是如果关闭了当前shell,命令也就终止执行了,这就是所谓"挂起来"了,可以理解为这个命令与当前shell绑定了。如果想让这个命令在shell关闭后继续执行,需要在这个命令前面加上nohup,就是不挂起的意思。
nohup,即no hang up,不挂起的意思,就是说,当前shell退出的时候,命令还在执行。
&,在后台执行命令,不阻塞当前命令行
举个例子
# /test是一个很大的目录,大概10G的小文件,正常我们这么执行删除就可以了
rm -rf /test
# 因为要删除的文件多,所以上面的命令执行后,当前的命令行就被阻塞了,等待删除完成,为了避免命令被阻塞,我们可以在命令后添加一个&表示在后台执行
rm -rf /test &
# 虽然在后台执行,但是与当前shell关联起来了,如果当前shell关闭了,这个命令执行就终止了,为了避免退出shell终止命令终止,可以在删除命令前增加一个nohup
nohup rm -rf /test &
最后,还有个技巧,往往我们执行命令会产生输出结果,因为如果我们使用nohup和&执行命令后,命令的执行结果将会输出到当前目录的nohup.out文件中(如果无权限,那么就会写到$HOME/nohup.out),虽然这个一般没什么影响,但是你不想平白无故多出来这么多nohup.out文件吧,一个好的方法是采用重定向,将日志输出到/dev/null中,表示丢弃输出:
# 例如:/test和/test1是两个又重复文件的目录,复制/test到/test1,过程很耗时,又会输出大量的覆盖命令
cp -vrf /test /test1
# 使用nohup和&后可以让它在后台执行,但是会生产nohup.out文件
nohup cp -vrf /test /test1 &
# 这个时候,可以采用重定向,把输出丢弃掉
nohup cp -vrf /test /test1 > /dev/null 2>&1 &
说明:
/dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃
2>&1表示把错误日志也输出到标准输出里面,这里1表示标准输出,2表示标准错误输出
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
好了,完事手工。
一个专注于.NetCore的技术小白

浙公网安备 33010602011771号