头图

我有一个SpringBoot应用,通过shell脚本start.sh启动。现在我期望通过守护进程的方式启动这个应用,这样我即使关掉终端,该应用也能继续运行。

使用Linux命令nohup 加上原始启动应用的脚本:

nohup ./start.sh &

打印的14286即为通过守护进程启动的进程ID:

这样我关掉终端,该应用也不会终止,可以继续运行了:

nohup 是一个在类 Unix 操作系统中常常使用的小工具,其名称来源于 no hang up,意思是“不中断”。它的主要功能是在用户退出登录会话或关闭终端的情况下继续运行一个命令。这在长时间运行的软件或脚本需要保持持续执行的情况下非常有用。

在多任务处理和远程连接频繁的 Linux 环境中,nohup 的应用场景非常广泛。例如,在长时间运行的批处理任务或远程服务器操作中,如果用户意外断开会话,未加防护的任务往往会被终止。nohup 则提供了一个简单而有效的解决方案。

首先,nohup 的基本用法是:

nohup command [args] &

其中,command 是你希望保持后台运行的命令,args 是该命令的参数,& 代表会将该命令放到后台执行。

先来看一个简单的例子:

假设你有一个需要长时间运行的 Python 脚本 long_running.py,直接在终端运行可能会被中途终止。这时可以通过 nohup 让它在后台运行:

nohup python long_running.py &

执行上述命令后,nohup 会自动将其输出重定向到一个文件,通常是 nohup.out,因此即便终端关闭,任务输出仍然保留。你可以通过以下命令来查看输出:

tail -f nohup.out

当然,如果你希望将输出重定向到一个特定的文件,可以这样做:

nohup python long_running.py > my_output.log 2>&1 &

这条命令的意思是,标准输出和标准错误都将被重定向到 my_output.log 文件中。

有时我们也希望不记录输出,直接将其扔掉:

nohup python long_running.py > /dev/null 2>&1 &

此时,所有的输出都会被重定向到 /dev/null,即丢弃。

nohup 也可以结合其他命令来使用。典型应用如通过 rsync 做大文件同步时:

nohup rsync -avz /source/dir/ user@remote:/destination/dir/ > rsync_output.log 2>&1 &

通过这种组合,即便网络连接中断,同步任务也不会受到影响。任务的进程信息会记录在 rsync_output.log 文件里。

另一个常见的用法是将与定时任务(通过 cronat 命令调度)结合使用,确保任务在后台可靠运行。例如:

编辑 crontab 文件:

crontab -e

添加如下条目:

* * * * * nohup /path/to/script.sh > /path/to/logfile.log 2>&1 &

这条配置会确保 script.sh 脚本每分钟运行一次,并将输出重定向到指定的日志文件。

理解 nohup 的原理是,它会忽略 SIGHUP 信号,即挂起信号,通常这个信号会在终端关闭或用户退出时发送到进程。nohup 使用 setsid() 调用启动一个新的会话,从而避免终端关闭对进程的影响。

尽管 nohup 是一个简单有效的工具,但并非万能。当需要更高级的进程管理能力时,可以用更为复杂的工具集,比如 screentmux,这些工具允许多个终端会话,把任务放到后台后还能随时恢复到前台继续操作。

要理解在一些基础设施较为繁杂的环境中,nohup 只是进程管理的一部分。对于需要高度可靠性的任务,如服务器运维、后台服务、或开发环境,systemd 这样的进程管理工具提供了持久化机制。在这些工具中,脚本的执行可以由系统控制,保证即便系统重启,脚本仍会自动启动和监控。

总结来讲,nohup 在 Linux 环境中添加了确保任务不中断执行的能力,是日常运维中一个重要的基本工具。通过合理运用 nohup,用户可以显著提高系统的可靠性及用户操作的便捷度。


注销
1k 声望1.6k 粉丝

invalid