test.sh
#!/bin/bash
while((1));do
echo `date '+%Y-%m-%d %H:%M:%S'`
sleep 1
done
后台运行脚本
-
执行脚本 ./test.sh,中断脚本 ctrl + c, 切到后台并暂停 ctrl + z
-
后台暂停的脚本状态是 stopped,使用 bg number 让其在后台开始运行(number由
jobs
命令查询到的[]中的数字,不是pid) -
直接在后台运行:
./test.sh &
-
查看当前shell环境中已启动的任务情况:
jobs
-
将 test.sh 切换到前台运行:
fg %number
-
中断后台运行的脚本,先 fg %number 切换到前台,再 ctrl + c,或是直接 kill %number
后台不中断运行脚本
-
后台不中断运行:
nohub ./test.sh &
, 打印信息输出在当前目录的 nohup.out 中 -
在当前终端使用
jobs
可看到 test.sh 处于 running 状态 -
使用
ps -ef | grep test.sh
可看到正在运行的 test.sh 脚本进程 -
在后台不中断运行 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 信号。