如何在Linux前后台切换程序, 用&把程序运行在后台和以Daemon方式运行的程序(控制台退出后程序继续保持运行)

通常,在生产环境中,Linux的专业用户都是通过命令行方式用ssh远程登陆Linux主机,通过命令行操作和使用

Linux的。

 

程序在前台运行:

通常,刚刚接触Linux的人或者不熟悉Linux的人,会发现登录后,在终端上输入命令运行一个程序后,终端上

就不能再输入命令了,直到刚才的程序运行完毕退出后,才能执行其它命令运行其它程序。我们管这种方式叫

程序在前台运行。

以iperf3 -s为例,一旦运行起来,终端上就不能再接收任何命令了,直到iperf3 -s退出

 

程序在后台运行:

就是程序运行起来后,不占用终端,终端能继续接收并执行其它命令,收后台运行。

如何后台运行一个程序呢,其实也很简单,在命令行最后加上&就可以了,如下面所示:

运行后会跳出如上所示的[1]776, [2]777,其中[1]和[2]表示后台进程编号,776和777是进

程的PID。这里回车后会发现还能继续输入命令,这就表示这二个iperf3 -s和iperf3 -s -p 9999

被运行在了后台,终端可以继续输入命令操作控制使用linux。

 

程序的前后台切换:

Ctrl+z, bg %[number], fg %[number], jobs -l命令可以把程序在前后台之前切换。

以iperf3 -s为例,

如何查看当前正在后台运行的程序:

如上图运行了二个后台的iperf3后,我们再输入jobs -l可以看到有二个后台程序在运行,

如何把后台程序切换到前台:

输入fg %1就可以把1号后台程序(PID号为666)的iperf3进程调到前台来了。这时控制台

被iperf3占用,无法再输入新的命令。

如何把前台程序切换到后台:

当程序在前台运行时,直接在键盘上按Ctrl + z则可,这时,会如下图所示,重新跳出命令

行提示符可以输入新的命令了,但我们可以看到提示被切到后台的程序此时不是在运行状态

而是在stopped状态(也可以通过输入jobs -l查看到状态是stopped)。

我们还需要输入bg %1命令,让1号后台程序恢复到运行状态(如下图)。

此时就完成了程序从前台到后台的切换。

 

当我们不是通过输入exit的方式(输入exit后,后台进程会被init接管,继续在后台运行)

退出终端时(网络断了,或者终端程序被关闭了等等),Linux初接触者往往会以为后台程序还在

运行,其实不然,当终端退出后,所有在这个终端上发起执行的前后台程序都会自动退出。

那么当我们执行一些需要花费很长时间(比如说,几个小时,甚至几天)的程序时,我们往往希望:

终端退出时,后台执行的程序保持后台运行不要退出

这时需要怎么办呢?这里我们就需要用到nohup命令

nohup iperf3 -s &

此时终端退出,程序就可以继续在后台运行了,我们再次通过ssh登录后,可以通过 cat nohup.out命令,查看

程序后台运行期间的输出的信息,如上图所示。

它与exit退出后,再次登陆的没有加nohup命令的后台程序的最大区别在于在能nohup.out文件里找到输出信息,

后没有加nohup的程序的输出信息已经不知道去哪里找了。

 

 

后台运行程序和以Daemon方式运行的程序的区别

通常加上nohup命令后台运行程序已经能满足我们日常的使用了,为什么这里还要提到Daemon程序呢,

从外面来看Daemon程序后后台运行程序并没有太大的不同,请注意他们有以下几个不同点。

1 )程序运行时不能使用命令将其转换成Daemon程序,只有编程时可以指定程序为Daemon程序

2)Daemon进程完全脱离终端控制台,而后台程序并未完全脱离终端,比如在终端未关闭前还是会往终端输出结果

3)Daemon进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,除非加上nohup

4)Daemon进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序

      在后台执行(这一条对于一般使用者来说并不重要)。

 

 

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要让一个 Python 程序在开机时自启动并一直在后台运行,可以使用 Python 内置的 `daemon` 模块。下面是一个简单的案例代码: ```python import daemon import time def main_program(): while True: with open('/tmp/my_program.log', 'a') as f: f.write('Program is running...\n') time.sleep(5) if __name__ == '__main__': with daemon.DaemonContext(): main_program() ``` 这个程序会在后台运行,每隔 5 秒钟向 `/tmp/my_program.log` 文件中写入一行日志。 现在来详细解释一下这个程序的代码: 1. `import daemon` 导入 `daemon` 模块。 2. `def main_program():` 定义一个主程序函数,里面是程序的主逻辑。 3. `while True:` 开始一个无限循环,表示程序会一直运行。 4. `with open('/tmp/my_program.log', 'a') as f:` 打开一个文件对象,用于写入日志。 5. `f.write('Program is running...\n')` 向文件中写入一行日志。 6. `time.sleep(5)` 程序暂停 5 秒钟。 7. `if __name__ == '__main__':` 判断是否在主程序运行。 8. `with daemon.DaemonContext():` 创建一个守护进程上下文环境。 9. `main_program()` 调用主程序函数。 在上面的代码中,我们使用了 `with` 语句来打开文件和创建守护进程上下文环境。这样可以确保程序运行完毕后,文件会被关闭并且守护进程会被正常终止。 同时,我们也使用了 `if __name__ == '__main__':` 的语句来判断是否在主程序运行。这样可以避免在导入模块时运行程序。 以上就是一个简单的 Python 开机自启动程序的示例代码和解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值