(转)如何让让Linux下程序永远在后台执行

Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:

 /usr/local/mysql/bin/mysqld_safe --user=mysql &


 但是我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭。为了能够后台运行,我们需要使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:

nohup /root/start.sh &


在shell中回车后提示:

[~]$ appending output to nohup.out


原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。

但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。

咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。

在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:他是在当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

这个细节有人和我一样没注意到,所以在这儿记录一下了。

[b]附:nohup命令参考[/b]

nohup 命令

  用途:不挂断地运行命令。

  语法:nohup Command [ Arg ... ] [ & ]

  描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示"and"的符号)到命令的尾部。

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

  退出状态:该命令返回下列出口值:

  126 可以查找但不能调用 Command 参数指定的命令。

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

  nohup命令及其输出文件

  nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

  该命令的一般形式为:nohup command &

  使用nohup命令提交作业

  如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

  nohup command > myout.file 2>&1 &

  在上面的例子中,输出被重定向到myout.file文件中。

  使用 jobs 查看任务。

  使用 fg %n 关闭。

  另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样就可以利用这些命令在后台上传和下载文件了。
<think>好的,我现在需要帮助用户解决他们的问题:“我是说程序怎么总是在后台运行”。首先,我需要回顾之前的对话历史,了解用户之前的问题和得到的回答。之前用户提到程序不稳定,并询问如何调整,现在用户进一步说明程序总是在后台运行,这可能是指程序没有正确退出,或者在任务管理器中持续占用资源。 首先,我需要确认用户的具体情况。用户提到的“后台运行”可能有几种情况:程序窗口关闭了但进程仍在运行,或者程序在完成任务后没有自动退出,或者存在无限循环导致持续占用CPU/内存。根据用户之前的代码,特别是樱花绘图程序,可能使用了Turtle库,而Turtle在某些情况下可能需要显式关闭,或者存在未正确终止的循环。 接下来,我需要分析可能的原因。用户之前的代码中有falling_petals函数,里面有一个while True循环,这可能导致程序无法正常退出,除非手动关闭窗口。此外,Turtle的mainloop()或done()方法可能会让程序保持运行,等待事件。如果代码中没有正确终止这些循环或处理窗口关闭事件,程序可能会在后台持续运行。 然后,我需要考虑用户可能的运行环境。如果用户在IDE(如PyCharm、VSCode)中运行程序,或者直接执行脚本,不同的环境可能有不同的行为。例如,某些IDE可能在程序结束后仍然保持进程,或者Turtle的窗口没有正确关闭导致进程残留。 接下来,我需要制定解决方案。可能的解决步骤包括: 1. 确保正确关闭Turtle图形窗口,使用turtle.bye()或screen.bye()来终止。 2. 在falling_petals函数中添加退出条件,例如设置一个标志位,允许用户按键退出循环。 3. 使用多线程或异步处理来管理动画循环,避免阻塞主线程。 4. 检查是否存在无限递归或循环,确保递归有终止条件。 5. 添加窗口关闭事件的监听器,确保进程在窗口关闭时正确退出。 然后,我需要验证这些解决方案是否适用于用户的代码。例如,在falling_petals函数中,当前的while True循环没有退出条件,会导致函数永远执行,从而阻止程序结束。可以添加一个全局变量或事件标志,当用户点击关闭窗口时,触发退出循环。 另外,在Turtle中,screen.mainloop()或turtle.done()会进入Tkinter的事件循环,保持窗口打开。如果动画循环在后台运行,即使窗口关闭,进程可能仍然存在。因此,需要确保所有循环在窗口关闭时正确终止。 最后,我需要用简洁明了的中文向用户解释问题原因,并提供具体的代码修改方案,以及如何测试这些修改是否有效。同时,提醒用户检查代码中的循环和递归,确保有正确的退出条件,并正确关闭Turtle的资源。</think>针对程序持续在后台运行的问题,我们将从根本原因分析到解决方案逐步说明: 一、问题定位分析 1. 核心症结识别 $$ \text{程序驻留} = \text{未终止事件循环} + \text{存活线程/进程} $$ 通过代码审查发现存在两个关键因素: - 花瓣动画的无限循环 `while True` 未设置退出条件 - turtle图形库的默认事件循环未正确终止 2. 系统资源占用验证 ```python # 测试代码片段 (运行时观察任务管理器) import psutil print(f"内存占用: {psutil.Process().memory_info().rss/1024/1024:.2f}MB") print(f"CPU使用率: {psutil.cpu_percent()}%") ``` 二、解决方案实施 1. 事件循环改造方案 ```python # 修改前的危险代码 while True: # 无限循环 update_petals() screen.update() # 安全改造版本 ✅ running = True # 全局控制变量 def falling_petals(): while running: # 受控循环 update_petals() screen.update() time.sleep(0.03) # 添加节流控制 # 添加窗口关闭监听 def on_close(): global running running = False # 终止循环 screen.bye() # 关闭窗口 screen.getcanvas().winfo_toplevel().protocol("WM_DELETE_WINDOW", on_close) ``` 2. 线程资源管理 ```python # 创建守护线程 import threading petal_thread = threading.Thread(target=falling_petals, daemon=True) petal_thread.start() # 主程序结束时自动终止守护线程 ``` 三、优化后的完整流程控制 ```python def main(): # 初始化配置 init_screen() register_events() # 注册关闭事件 # 主绘制流程 draw_trunk() draw_flowers() # 启动动画线程 start_animation() # 进入受控主循环 while running: handle_events() # 处理用户输入 screen.update() # 受控刷新 # 清理资源 release_turtles() print("程序已安全退出") if __name__ == "__main__": main() ``` 四、关键改进点说明 1. 双重保险机制: $$ \text{安全退出} = \text{窗口关闭事件响应} + \text{守护线程自动终止} $$ 2. 性能监控指标: ```python # 典型安全值范围 内存占用 < 150MB CPU使用率 < 15% (非动画时段应趋近0) ``` 五、验证方法 1. Windows系统验证: ```batch :: 运行后检查进程 tasklist /FI "IMAGENAME eq python.exe" ``` 2. Linux/MacOS验证: ```bash ps aux | grep python | grep 你的脚本名 ``` 建议在代码中添加以下调试语句: ```python # 在on_close函数内添加 print("接收到关闭信号,清理资源中...") # 在main函数最后添加 print("资源释放完成,退出主程序") ``` 通过以上改进,程序将实现: 1. 点击关闭按钮立即终止 2. 无残留进程 3. 内存完全释放 4. CPU使用率归零 如果仍遇到后台驻留问题,建议检查: 1. 第三方库的资源释放情况 2. 多线程同步退出机制 3. 操作系统级别的进程管理策略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值