nohup命令——后台执行命令

# nohup命令

## 0x01 发现问题

经常使用xshell等工具,需要执行多个命令时,当前命令行已被上一命令占据,再开一个窗口有些浪费资源,nohup可以结合”&“实现后台执行无交互命令,并指定输出的目的.

命令行被占用

试想,此处如果需要通过ssh的方式,在远端主机上执行一条nmap的全端口扫描任务,但是ssh连接断开时nmap扫描状态会随着ssh状态变化而失效,下次登陆需要重新进行扫描。

那么,下面的这条命令可以解决问题么?

1
nohup nmap -p 1-65535 -T4 -A -v -Pn -sV -sS 111.*.*.* > zixun

## 0x02 后台运行“&”

“&”符号可以将命令符后台运行。如find命令或者其他shell脚本,并且执行过程中无交互,否则会一直处于等待状态。

eg: sh test.sh &

到此,我们可以将命令设置为形如下面的示例:

1
nohup nmap -p 1-65535 -T4 -A -v -Pn -sV -sS 111.*.*.* > zixun &

## 0x03 “2>&1”

至此,一个完整的命令为:

1
nohup command >out.file 2>&1 &

即:

1
nohup nmap -Pn -PS -sV -sS -p 1-65535 192.168.1.1 -oX out.xml > nohup.txt 2>&1 &

实际的一次操作过程如下:

nohup1

nohup2

nohup3

## 0x04 会话保持/终止

  • 正常使用
  • 使用了nohup之后,在当前账户非正常退出或者结束的时候,命令会结束。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。
  • 其他情况
  • ctrl + z :可以将一个正在前台执行的命令放到后台,并且处于暂停状态。
  • Ctrl+c :终止前台命令。
  • jobs :查看当前有多少在后台运行的命令。
    • jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。
  • 终止
  • 命令成功执行后,会显示一个进程号,可以用它来监控该进程,或kill它。(ps -ef | grep 进程号 或者 kill -9 进程号)

## 0x05 注意几点

  • command > out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
  • 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&, 是让该命令在后台执行。
  • 命令”nohup nmap -Pn -PS -sV -sS -p 1-65535 192.168.1.1 -oX out.xml > nohup.txt 2>&1 &“中:
    • nmap 扫描将结果输出到out.xml
    • nohup 将过程输出重定向到nohup.txt
    • 2>&1 也将标准出错重定向到nohup.txt