linux程序使用后台启动stopped原因及解决

当使用strace工具跟踪进程(如Process2613)时,如果遇到进程因SIGTTIN信号而暂停,一种解决方法是给进程提供输入,例如将程序的输入重定向到/dev/null,以避免需要用户交互的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strace -e trace=none -p PID
发现
strace: Process 2613 attached
--- stopped by SIGTTIN ---
解决办法:给个输入它
program </dev/null &

要善用trace工具分析故障点。

<think>我们正在处理用户的问题:"我想将正在运行的Linux程序移动到后台执行" 根据用户的问题,我们需要提供将正在运行的Linux程序移动到后台执行的方法。 在Linux中,将正在运行的程序移动到后台通常涉及以下步骤: 1. 暂停当前正在前台运行的程序(如果它正在运行)。 2. 使用bg命令将其放入后台运行。 但是,用户可能已经启动了一个程序,而没有使用&(后台启动)或nohup(忽略挂断信号)。因此,我们需要告诉用户如何将已经在前台运行的程序放入后台。 具体步骤: 1. 在运行程序的终端中,按下Ctrl+Z。这将暂停该程序(发送SIGTSTP信号)。 2. 然后,使用命令`bg`将暂停的程序后台继续运行(发送SIGCONT信号)。 另外,如果用户希望程序后台运行并且不受终端关闭的影响(即忽略SIGHUP信号),可以使用`disown`命令或者使用`nohup`启动程序。但这里用户是已经运行的程序,所以可以使用`disown`。 另一种方法是使用`jobs`命令查看作业号,然后使用`bg %n`(n为作业号)将作业放入后台运行。 注意:如果用户关闭终端,即使程序后台,也可能会收到SIGHUP信号而终止。为了避免这种情况,可以使用`disown`命令将作业从当前shell的作业表中移除,这样终端关闭时就不会发送SIGHUP信号给该作业。 参考引用: 引用[2]提到了在ssh中运行后台任务,当退出时,如果使用&启动,bash退出时会发送SIGHUP给进程组,导致进程终止。而使用nohup可以避免。 引用[3]展示了jobs -l命令的输出,可以看到后台作业的状态(停止、运行等)。 因此,我们可以给出以下步骤: 步骤1:使用Ctrl+Z暂停前台程序。 步骤2:使用bg命令让程序后台继续运行。 步骤3(可选):使用disown命令将作业从作业表中移除,这样即使终端关闭,程序也不会终止。 另外,如果程序已经启动,我们也可以使用其他方法,比如使用screen或tmux等终端复用器,这样即使断开连接,程序也会继续运行。 但是,用户的问题只是“移动到后台”,所以我们先给出基本方法。 示例: 假设我们运行了一个长时间运行的程序,比如`sleep 1000`,然后我们按下Ctrl+Z,它会显示: [1]+ Stopped sleep 1000 然后,我们输入: $ bg %1 或者直接输入`bg`(因为%1是当前作业) 它会显示: [1]+ sleep 1000 & 这样,程序就在后台运行了。 如果希望程序在终端关闭后继续运行,可以执行: $ disown %1 这样,这个作业就被从作业表中移除,并且终端关闭时不会发送SIGHUP信号给它。 另外,如果用户想要在启动程序时就放到后台,可以使用`&`,例如: $ sleep 1000 & 或者使用nohup: $ nohup sleep 1000 & 但是用户的问题是关于已经运行的程序。 因此,我们的回答将包括: 1. 使用Ctrl+Z暂停程序。 2. 使用bg命令让程序后台继续运行。 3. 使用disown命令使程序与终端脱离(可选)。 同时,我们也可以提到使用screen或tmux作为替代方案,这样更灵活。 生成相关问题: 1. 如何将后台程序带回前台? 2. 如何让程序退出终端后继续运行? 3. 如何查看当前的后台作业? 根据引用[3],我们可以使用`jobs -l`查看后台作业。 下面组织回答:</think>### 将正在运行的 Linux 程序移动到后台执行的方法 #### 1. **暂停程序并移至后台** - 在程序运行的前台终端中按 `Ctrl + Z`,程序会立即暂停并显示作业号(如 `[1]+ Stopped`)。 - 输入 `bg %n`(`n` 为作业号),程序将在后台继续运行: ```bash # 示例:暂停后启动后台运行 [1]+ Stopped sleep 1000 # 按 Ctrl+Z 后 $ bg %1 # 程序后台继续运行 [1]+ sleep 1000 & ``` #### 2. **直接切换运行状态(无需暂停)** - 若程序已在运行,按 `Ctrl + Z` 暂停后,可直接用 `&` 符号唤醒到后台: ```bash $ fg %n & # 将作业 n 唤醒到后台 ``` #### 3. **脱离终端控制(避免关闭终端时被终止)** - 使用 `disown` 移除作业与终端的关联,即使关闭终端程序仍继续运行: ```bash $ disown %n # 移除作业 n ``` - 或启动直接使用 `nohup`: ```bash $ nohup ./program & # 忽略 SIGHUP 信号 ``` #### 4. **查看后台作业** - `jobs -l` 显示所有后台作业的 PID 和状态: ```bash $ jobs -l [1]- 9154 Stopped vim # 暂停状态 [2]+ 9368 Running find / -print & # 后台运行中 ``` #### ⚠️ 注意事项 - **后台程序仍受终端限制**:若未用 `nohup` 或 `disown`,关闭终端会发送 `SIGHUP` 信号终止程序[^2]。 - **输入/输出重定向**:后台程序若需输入会暂停,建议用重定向(如 `./program > log.txt 2>&1 &`)。 --- ### 相关问题 1. 如何将后台程序带回前台执行? 2. `nohup` 和 `disown` 在脱离终端控制时有何区别? 3. 如何查看后台程序的实际资源占用(如 CPU、内存)? 4. 终端关闭后,如何重新连接已脱离的后台程序? [^1]: `jobs -l` 可显示后台作业的 PID 和状态[^3]。 [^2]: 未脱离终端的后台程序会在终端关闭时被终止[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值