在 Linux 中,nohup 命令用于在用户退出登录后继续运行指定的命令或脚本。默认情况下,nohup 会忽略挂起(SIGHUP)信号,以确保进程在终端关闭后仍然运行。然而,如果你希望显式地忽略挂起信号,可以结合使用 nohup 和 trap 命令来实现更精细的控制。
以下是如何通过 nohup 和 trap 忽略挂起信号的详细步骤和示例:
nohup 和 trap 忽略挂起信号基本概念:
nohup:用于在用户退出登录后继续运行命令,忽略挂起信号(SIGHUP)。trap:用于设置信号处理程序,可以用来捕获并忽略特定的信号。示例脚本:
创建一个名为 ignore_hup.sh 的脚本,内容如下:
#!/bin/bash
# 捕获 SIGHUP 信号并忽略
trap '' SIGHUP
# 执行你想要在后台运行的命令
while true; do
    echo "进程正在运行,PID=$$"
    sleep 10
done
解释:
trap '' SIGHUP:当接收到 SIGHUP 信号时,执行空操作(即忽略该信号)。while true; do ... done:一个无限循环,每隔 10 秒输出一次进程的 PID。赋予执行权限:
chmod +x ignore_hup.sh
使用 nohup 运行脚本:
nohup ./ignore_hup.sh &
解释:
nohup:确保脚本在退出登录后继续运行,并忽略挂起信号。&:将脚本放入后台运行。验证进程是否忽略挂起信号:
你可以通过以下命令查看进程是否仍在运行:
ps aux | grep ignore_hup.sh
即使你关闭终端或注销,该进程也应该继续运行。
信号处理:trap 命令不仅可以忽略信号,还可以定义其他自定义的信号处理逻辑。例如,你可以捕获 SIGINT(中断信号)并执行特定的操作。
后台运行:使用 & 将命令放入后台运行,确保即使终端关闭,命令也能继续执行。
日志输出:nohup 默认会将输出重定向到 nohup.out 文件。如果你希望将输出重定向到其他文件,可以使用:
nohup ./ignore_hup.sh > output.log 2>&1 &
这样,标准输出和标准错误都会被重定向到 output.log 文件。
通过上述方法,你可以在 Linux 中使用 nohup 和 trap 命令来忽略挂起信号,确保你的进程在终端关闭后仍然继续运行。