nohup
使用 nohup
和 &
可以将程序在后台运行,并确保它不会因为终端关闭而停止。这里是一个基本的使用示例:
运行命令并将其放在后台
nohup your_command > output.log 2>&1 &
your_command
是你要执行的命令或脚本。> output.log
将标准输出(stdout)重定向到output.log
文件中。2>&1
将标准错误(stderr)重定向到标准输出(stdout),也就是同样写入output.log
文件。当然,这个也可以不写。&
确保命令在后台运行。
示例
假设你有一个脚本 script.sh
,你可以这样启动它:
nohup bash script.sh > script.log 2>&1 &
这里:
bash script.sh
是要运行的脚本。> script.log
将所有输出(包括错误)保存到script.log
文件。&
让script.sh
在后台运行。
检查后台任务
你可以使用 jobs
命令查看当前后台运行的任务:
jobs
也可以用 ps
命令或 top
命令来查看进程列表,确认你的程序是否在运行。
终止后台任务
如果你需要终止后台任务,可以使用 ps
查找进程 ID(PID),然后用 kill
命令终止它。
例如:
ps aux | grep script.sh
找到对应的 PID 后,使用:
kill PID
或者,如果需要强制终止:
kill -9 PID
通过这种方式,你可以确保即使关闭终端,运行中的程序也会继续执行。
其他方式
2. 使用screen命令
screen是一个可以在多个窗口中管理多个会话的终端复用器。通过screen,可以创建新的会话并在其中运行程序,即使关闭终端,这些会话也会继续运行。具体步骤如下:
-
安装screen(如果尚未安装):
sudo apt-get install screen # 以Debian/Ubuntu为例
-
创建一个新的screen会话:
screen -S session_name
其中
session_name
是你给会话指定的名称。 -
在新的会话中运行你的程序。
-
使用
Ctrl + a
然后按d
将session分离,并返回到原始shell。此时可以安全地关闭终端。 -
之后,可以通过
screen -r session_name
命令重新连接到之前创建的会话。
3. 使用disown命令
在将程序放到后台运行(即在命令后加上&
)后,可以使用disown命令将其从当前shell的作业控制中剥离出来,这样关闭终端后,该程序仍然会继续运行。具体命令如下:
./your_program &
disown
但通常更推荐在启动程序时立即使用disown
,如下所示:
./your_program & disown
4. 使用systemd服务
对于需要在系统启动时自动运行且持久运行的程序,可以考虑将其编写为systemd服务。具体步骤包括编写服务文件、启用并启动服务等。服务文件通常放在/etc/systemd/system/
目录下,包含服务的描述、启动命令、重启策略等信息。编写完成后,可以使用systemctl
命令管理服务。
注意事项
- 使用以上任何方法时,都需要确保你了解正在运行的程序及其输出,以便在需要时能够监控和管理它们。
- 某些情况下,即使使用了上述方法,也可能因为程序本身的问题或系统资源的限制而导致任务中断。因此,定期检查和维护这些后台任务是必要的。
- 考虑到安全和性能因素,不建议长期运行大量不必要的后台任务。应该定期审查和清理不再需要的任务。