后台不中断运行脚本


test.sh

#!/bin/bash
while((1));do
  echo `date '+%Y-%m-%d %H:%M:%S'`
  sleep 1
done

后台运行脚本

  1. 执行脚本 ./test.sh,中断脚本 ctrl + c, 切到后台并暂停 ctrl + z

  2. 后台暂停的脚本状态是 stopped,使用 bg number 让其在后台开始运行(number由jobs命令查询到的[]中的数字,不是pid)

  3. 直接在后台运行:./test.sh &

  4. 查看当前shell环境中已启动的任务情况:jobs

  5. 将 test.sh 切换到前台运行:fg %number

  6. 中断后台运行的脚本,先 fg %number 切换到前台,再 ctrl + c,或是直接 kill %number

后台不中断运行脚本

  1. 后台不中断运行:nohub ./test.sh &, 打印信息输出在当前目录的 nohup.out 中

  2. 在当前终端使用 jobs 可看到 test.sh 处于 running 状态

  3. 使用 ps -ef | grep test.sh 可看到正在运行的 test.sh 脚本进程

  4. 在后台不中断运行 test.sh,可使用 nohup 忽略 hangup 信号,或使用 setsid 将其父进程改为 init 进程

后台不中断运行脚本的另一个命令:setsid .test.sh &ps -ef | grep test.sh 可看到 test.sh 父进程 id 为1 (user名为 kernoops,kill该进程需要root权限)

当父进程退出时,会发送 hangup 信号给所有子进程,子进程收到hangup信号后也会退出,所以要想退出当前shell终端时 test.sh 继续运行,则需要使用 nohup 来忽略 hangup 信号。

相关