精华内容
下载资源
问答
  • 装了office后,配置好了邮箱,但是每次进入邮箱后,只要点退出,就关了。不能后台运行,邮件提醒。该插件只要下载后运行后即可设置outlook后台运行
  • android 判断应用程序在前台还是在后台运行 查看相关博客:http://blog.csdn.net/u012184853/article/details/51135242
  • Activity后台运行方法

    2015-09-23 13:31:10
    鉴于有时需要Activity在后台运行,该文档提供了Activity后台运行的方法
  • Android 后台运行 定时器 AlarmManager Service
  • 可以实现service后台运行,自启动,隐藏安装图标,相当简单易懂,studio直接导就行
  • Linux后台运行程序最实用的两种方式

    千次阅读 多人点赞 2020-12-16 17:16:23
    在Linux后台跑程序什么最好用?拒绝花里胡哨,运维大佬教你最实用的两招!快,快上车~

      Linux如何在后台跑程序?是刚接触Linux的同学都会遇到的问题。大家使用Linux操作系统时,或许都遇到过以下类似场景。

    • 场景1:我用xshell通过 telnet/ssh 远程登录服务器,跑脚本或执行一些耗时较长的任务,有时会因为网络不稳定或手贱等原因断开我的控制终端(如:xshell、sourceCRT)的远程连接状态,导致花费大量时间执行的程序又要重新跑;真难受!

    • 场景2:我需要长时间稳定的跑脚本,希望能在Linux后台跑,关掉xshell也没事,且随时可以回来看输出信息或操作。

      如果你曾被这类问题困扰过,或现在正为此发愁?那么请往下看。本文给大家分享我们在运维工作过程中最常用也最实用的两种后台跑程序方式。记得Mark

    应对手段

      我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程(包括sshd及其子进程)。

    因此,我们的解决办法就有两种途径(对应以下两种方式):

    • 让进程忽略 HUP 信号,
    • 让进程运行在新的会话里从而成为不属于此终端的子进程。

    方式一:nohup 命令 &

      nohup 是我们最常用的办法。顾名思义,nohup 就是让提交的命令忽略 hangup 信号。从而当ssh连接状态断开时,不会被系统中断掉。nohup 在使用上十分方便,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上 & 表示将命令放入后台运行。

    比如我们测试在后台执行 ping www.baidu.com 命令,如下即可:

    nohup ping www.baidu.com &
    

    在这里插入图片描述

    同时,会在输入命令的目录下生成一个nohup.log日志文件(如已有该文件则继续使用)

    当然,也可加上 >filename 2>&1 来自行更改日志输出的目录及文件filename。如下:

    nohup ping www.baidu.com > /home/myout.log 2>&1 &
    

    在这里插入图片描述

    方式二:screen

      我们认为Screen是目前最实用的Linux后台运行工具之一。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端,每个伪终端我们称之为一个session。

      相当于我们可以用xshell打开多个连接(session),不用时可以将这些连接置为离线状态 - Detached离线状态下session中的程序会正常运行,也就是后台运行,并随时可以恢复继续使用,恢复使用时为Attached在线状态,说明有人正在使用。

    1、如何使用screen

    在这里插入图片描述

      上图是screen的session列表,图中Attached代表有其他终端正在使用这个session,Detached说明session处于离线状态,

    下面一起来看一下我们使用Screen时,常用的一些命令:

    screen -S name -> 创建一个名为:name 的session(伪终端)
    
    screen -R name -> 先试图恢复离线的session。若找不到离线的,即建立新的session(伪终端)
    
    screen -ls -> 列出所有已经存在的session
    
    ctrl + a + d -> 退出当前的session
    
    screen -d name -> 将指定的session作业离线。
    
    screen -d -r name -> 离线当前session,恢复并回到name这个session
    
    kill (session进程号) -> 杀掉某个session进程
    

    实际操作流程示例
    1、创建一个名称为“chh”的session。

    # 创建方式一
    screen -S chh
    # 创建方式二
    screen -R chh
    

    2、创建后会自动进入session,进行相关操作。
    在这里插入图片描述

    3、通过ctrl + a + d退出当前session,使其后台(离线)运行
    在这里插入图片描述

    4、screen -ls 查看session列表
    在这里插入图片描述

    5、通过screen -r chhscreen -r 9043(进程号)登录离线session

    6、杀掉“chh”这个session

    kill 9043(进程号)
    

    2、screen 工具需安装

    • 如果你使用yum软件包管理工具:yum install screen
    • 如果你使用APT软件包管理工具:apt-get install screen

    另:手动下载地址:http://ftp.gnu.org/gnu/screen/

    3、screen 后台运行原理

    我们可以通过查看进程树来理解screen是如何不受ssh断开影响的。

    • 这是不用screen的普通运行方式及进程树
    [root@pvcent107 ~]# ping www.baidu.com &
    [1] 9499
    [root@pvcent107 ~]# pstree -H 9499
    init─┬─Xvnc
         ├─acpid
         ├─atd
         ├─2*[sendmail]	
         └─sshd─┬─sshd───sshd───bash───ping
                └─sshd───sshd───bash───pstree
    

      我们可以看出,未使用 screen 时我们所处的 bash 是 sshd 的子进程,当 ssh 断开连接时,HUP 信号自然会影响到它下面的所有子进程(包括我们新建立的 ping 进程),杀掉所有子进程。

    • 再看看使用 screen 运行进程的进程树
    [root@pvcent107 ~]# screen -r chh
    [root@pvcent107 ~]# ping www.baidu.com &
    [1] 9488
    [root@pvcent107 ~]# pstree -H 9488
    init─┬─Xvnc
         ├─acpid
         ├─atd
         ├─screen───bash───ping
         ├─2*[sendmail]
    

      如图可见,bash 是 screen 的子进程,而 screen 是 init(PID为1)的子进程。那么当 ssh 断开连接时,HUP 信号自然不会影响到 screen 下面的子进程了。

    附、一张有故事的照片(十三)

    在这里插入图片描述

    最近这个图在我朋友圈刷屏了
    是 LOL 的 s1 界面
    看到时心中五味杂陈
    那时,我还是个意气风发的网瘾少年
    还有梦想
    十年之后

    展开全文
  • android app后台运行

    千次阅读 2020-09-09 13:51:42
    Android app后台运行可行方案需求由来方案代码实现 需求由来 最近一个项目由于特殊原因,好几个不懂技术的人来当甲方,人人都是产品经理,没有项目经理,功能和实现细节要自己想自己定,再加上个比较无语的**(代码...

    Android app后台运行可行方案

    需求由来

    最近一个项目由于特殊原因,好几个不懂技术的人来当甲方,人人都是产品经理,没有项目经理,功能和实现细节要自己想自己定,再加上个比较无语的**(代码逻辑和实现方案让你吃惊),具体就不吐槽了。把自己得事情做好,把心态放平稳些。

    我的印象里让应用后台保持运行这个功能一直都被提过。。。这个功能真的让人心烦,也让用户心烦,反正我得手机上如果我发现有这样得没有必要得应用,我都会干掉他。

    方案

    应用后台保活,后台运行,长时间后台任务这些说法,目前我接触到最靠谱得还是通过系统提供的方式,那些启动各种服务等等的都不行;如果要是设备上的系统应用的话(使用mtk或者其他厂商的原生android系统),那只通过启动服务,广播这些就可以帮你完成大部分需求,适量添加接下来的功能;如果要是安装到手机的普通应用的话,还是需要系统和厂家提供的方式最靠谱,但也有一些弊端,需要引导用户去设置。

    代码实现

    1: 忽略电池优化:
    有些手机设置这一项就可以达到系统不清理当前应用的效果,例如我这个三星测试机;调用后会有系统的弹窗,api在23及以上,提供查询api和弹窗设置;代码如下
    
    // 权限
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    
    // 查询是否允许
    @RequiresApi(api = Build.VERSION_CODES.M)
    fun isIgnoringBatteryOptimizations(context: Context): Boolean {
        var isIgnoring = false
        val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager?
        if (powerManager != null) {
            isIgnoring = powerManager.isIgnoringBatteryOptimizations(context.packageName)
        }
        return isIgnoring
    }
    
    // 通过系统弹窗让用户设置
    @RequiresApi(api = Build.VERSION_CODES.M)
    fun requestIgnoreBatteryOptimizations(context: Context) {
        try {
            val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
            intent.data = Uri.parse("package:" + context.packageName)
            context.startActivity(intent)  // 此处如需要回调的话那就使用另一种方式开启
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
    }
    
    2:通过各自手机厂商的系统应用去管理当前应用可后台运行;引导用户去设置时需要提示用户如何操作,不管是弹窗也好,开启页面图文说明也好总是是要提示用户的;我这里就简单通过弹窗来提示操作;我分为两部分,前部分为统一的,就是为啥需要开启这些,给用户说明一下;另一部分就是针对不同厂家的手机做不同的提示说明了。如下代码
    
    /**
    * 相关的描述看里面注释,自己照着可以做适当修改
    */
    fun getDesc(context: Context): String {
    	// 这个描述简单说明下为什么需要开启这些设置;后面再加个换行符
        val baseDesc = context.resources.getString(R.string.permissionsutil_getdesc_desc_top)
        if (RomUtils.isHuawei()) {
        	//关闭应用的自动管理,设置允许后台活动和自启动
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_huawei)
        } else if (RomUtils.isXiaomi()) {
        	//授权管理 -> 自启动管理 -> 允许应用自启动和后台活动
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_xiaomi)
        } else if (RomUtils.isOppo()) {
        	//授权管理 -> 自启动管理 -> 允许应用自启动和后台活动
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_oppo)
        } else if (RomUtils.isVivo()) {
        	//权限管理 -> 自启动 -> 允许应用自启动和后台活动
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_vivo)
        } else if (RomUtils.isMeizu()) {
        	//权限管理 -> 后台管理 -> 允许应用后台运行
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_meizu)
        } else if (RomUtils.isSamsung()) {
        	//自动运行应用程序 -> 打开应用开关;设置应用可后台运行相关选项
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_samsung)
        } else if (RomUtils.isLeeco()) {
        	//自启动管理 -> 允许应用自启动
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_leeco)
        } else if (RomUtils.isSmartisan()) {
        	//权限管理 -> 自启动权限管理;设置应用可后台运行相关选项
            return baseDesc + context.resources.getString(R.string.permissionsutil_getdesc_desc_smartisan)
        } else {
            return baseDesc
        }
    }
    
    

    在弹窗里引导用户去设置后代码如下:

    fun showActivity(context: Context, packageName: String) {
        val launchIntentForPackage = context.packageManager.getLaunchIntentForPackage(packageName)
        context.startActivity(launchIntentForPackage)
    }
    
    fun showActivity(context: Context, packageName: String, activityDir: String) {
        val intent = Intent().apply {
            component = ComponentName(packageName, activityDir)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        }
        context.startActivity(intent)
    }
    
    fun showActivityForMeizu(context: Context){
        val intent = Intent()
        val unflattenFromString = ComponentName.unflattenFromString("com.meizu.safe.permission.PermissionMainActivity")
        intent.setComponent(unflattenFromString)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
    }
    
    
    fun showDetailActivity(context: Context){
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
            setData(Uri.fromParts("package",context.packageName,null))
        }
        context.startActivity(intent)
    }
    

    下面代码里有很多打印和异常处理,根据自己需要修改,可以试试自己的测试机跳的页面对不对,如果不对通过adb找对应的路径。 做下异常处理 下面的代码有些机型没有测试,最后出异常直接跳到应用详情里去

    fun checkBackgroundPermission(context: Context) {
        if (isHuawei()) { // 应用启动管理 -> 关闭应用开关 -> 打开允许自启动
            LogUtil.e("checkBackgroundPermission", "isHuawei")
            try {
                showActivity(context,
                        "com.huawei.systemmanager",
                        "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isHuawei e: " + e.message)
                try {
                    showActivity(context,
                            "com.huawei.systemmanager",
                            "com.huawei.systemmanager.optimize.bootstart.BootStartActivity")
                } catch (e: Exception) {
                    showDetailActivity(context)
                }
            }
        } else if (isXiaomi()) { // 授权管理 -> 自启动管理 -> 允许应用自启动
            LogUtil.e("checkBackgroundPermission", "isXiaomi")
            try {
                showActivity(context,
                        "com.miui.securitycenter",
                        "com.miui.permcenter.autostart.AutoStartManagementActivity")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isXiaomi e: " + e.message)
                showDetailActivity(context)
            }
        } else if (isOppo()) { // 权限隐私 -> 自启动管理 -> 允许应用自启动
            LogUtil.e("checkBackgroundPermission", "isOppo")
            try {
                showActivity(context, "com.coloros.phonemanager")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isOppo e: " + e.message)
                try {
                    showActivity(context, "com.coloros.oppoguardelf")
                } catch (e: Exception) {
                    try {
                        showActivity(context, "com.coloros.safecenter")
                    } catch (e: Exception) {
                        showDetailActivity(context)
                    }
                }
            }
        } else if (isVivo()) { // 权限管理 -> 自启动 -> 允许应用自启动
            try {
                if (Build.VERSION.SDK_INT >= 26) {
                    showActivity(context, "com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.PurviewTabActivity")
                } else {
                    showActivity(context, "com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.SoftwareManagerActivity")
                }
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isVivo e: " + e.message)
                try {
                    showActivity(context, "com.iqoo.secure")
                } catch (e: Exception) {
                    showDetailActivity(context)
                }
            }
    
        } else if (isMeizu()) { // 权限管理 -> 后台管理 -> 点击应用 -> 允许后台运行
            LogUtil.e("checkBackgroundPermission", "isMeizu")
            try {
                showActivity(context, "com.meizu.safe")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isMeizu e: " + e.message)
                try {
                    showActivityForMeizu(context)
                } catch (e: Exception) {
                    showDetailActivity(context)
                }
            }
        } else if (isSamsung()) { // 自动运行应用程序 -> 打开应用开关 -> 电池管理 -> 未监视的应用程序 -> 添加应用
            LogUtil.e("checkBackgroundPermission", "isSamsung")
            try {
                showActivity(context, "com.samsung.android.sm_cn")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isSamsung e: " + e.message)
                try {
                    showActivity(context, "com.samsung.android.sm")
                } catch (e: Exception) {
                    showDetailActivity(context)
                }
            }
        } else if (isLeeco()) { // 自启动管理 -> 允许应用自启动
            LogUtil.e("checkBackgroundPermission", "isLeeco")
            try {
                showActivity(context,
                        "com.letv.android.letvsafe",
                        "com.letv.android.letvsafe.AutobootManageActivity")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isLeeco e: " + e.message)
                showDetailActivity(context)
            }
        } else if (isSmartisan()) { // 权限管理 -> 自启动权限管理 -> 点击应用 -> 允许被系统启动
            LogUtil.e("checkBackgroundPermission", "isSmartisan")
            try {
                showActivity(context, "com.smartisanos.security")
            } catch (e: Exception) {
                LogUtil.e("checkBackgroundPermission", "isSmartisan e: " + e.message)
                showDetailActivity(context)
            }
        }
    }
    

    基本就这些了,各位可以自己copy下来调试调试。可以参考下下面这篇文章,当时特意下了悦跑圈来看这个应用怎么实现的,也感谢作者的开源精神。添加链接描述
    https://juejin.im/post/6844904023955341319

    展开全文
  • android实现开机自启动以及后台运行

    热门讨论 2012-05-18 19:08:00
    android 实现开机自启动和后台运行 要求版本最低为2.1
  • 运行jar java -jar xxx.jar 这种方式运行jar 终止jar运行方式: 1、ctr+c 2、关闭窗口就可以停止运行该jar 后台运行jar java -jar xxx.jar &...nohup代表程序后台运行,程序日志会输出到当前目录下的nohup.o.

    运行jar

    java -jar xxx.jar
    
    

    这种方式运行jar 终止jar运行方式:
    1、ctr+c
    2、关闭窗口就可以停止运行该jar


    后台运行jar

    java -jar xxx.jar &
    

    & 代表后台运行

    这种方式运行jar 终止jar运行方式:
    1、关闭窗口
    2、通过命令终止jar程序的运行(文末方法)


    后台运行,并打印日志到默认文件

    nohup java -jar xxx.jar &
    
    

    nohup代表程序后台运行,程序日志会输出到当前目录下的nohup.out文件

    终止jar运行方式:
    1、通过命令终止jar程序的运行(文末方法)


    后台运行,并打印日子到指定文件

    nohup java -jar xxx.jar >./logs.txt &
    

    >./logs.txt 指定程序日志输出到./logs.txt文件内

    终止jar运行方式:
    1、通过命令终止jar程序的运行(文末方法)


    通过命令终止jar程序的运行:

    1、查看jar包进程:
    ps aux|grep getCimiss-surf.jar

    将会看到此jar的进程信息
    data 5796 0.0 0.0 112656 996 pts/1 S+ 09:11 0:00 grep --color=auto getCimiss-surf.jar data 30768 6.3 0.4 35468508 576800 ? Sl 09:09 0:08 java -jar getCimiss-surf.jar

    其中30768则为此jar的pid,杀掉命令为

    2、kill -9 30768
    (kill -9 xxx 结束进程id为xxx的进程)

    展开全文
  • Android 仿QQ后台运行时收到推送消息 在顶部弹出 源码,用到类似 Heads-up 组件的库。
  • 在linux后台运行脚本命令和程序的方法大全

    万次阅读 多人点赞 2019-10-27 14:50:50
     linux提供了很多方法可以直接将普通的命令、脚本、应用程序以后台的形式运行起来,这样就不会阻塞终端窗口的继续使用。常用的涉及后台执行的命令有十几多个,包括:&、ctrl+z、bg、fg、nohup、disown、...

     需要在linux后台执行任务的情况还是经常会遇到的,比如一些费时的操作,或者一些需要长时间存在的程序。当然你也可以把这些任务做成守护进程或者后台服务,但这需要额外的工作量。

     linux提供了很多方法可以直接将普通的命令、脚本、应用程序以后台的形式运行起来,这样就不会阻塞终端窗口的继续使用。常用的涉及后台执行的命令有十几多个,包括:&、ctrl+z、bg、fg、nohup、disown、setsid、(cmd)、jobs、ps、kill 等。

     下面先对每个命令的功能作用做一个简单的介绍,然后分别给出使用案例进行详细解释。

    1、后台执行脚本命令功能介绍

    &:将当前命令以后台的形式运行;
    ctrl+z:将前台任务转后台并冻结;
    bg:将后台冻结的任务再次运行起来;
    fg:将后台任务重新转前台执行;
    nohup:隔离终端挂断信号,是命令的前缀;
    disown:隔离终端挂断信号,事后使用;
    setsid:重新创建一个会话进程来执行任务;
    (cmd):创建一个独立shell来执行命令;
    jobs:查看在后台运行的任务列表;
    ps:查看正在运行的进程信息;
    kill:杀掉某个进程;

     下面就分别对上面的命令举例来说说如何让脚本命令在后台执行,先看一下测试用例。

    2、后台脚本任务测试用例

     下面所有的例子中的脚本统一使用这个脚本,它的功能是每2秒打印一次当前时间。hzqtest8.sh是测试脚本的名字,.sh文件最好放在当前用户默认目录中(如果你放在其他目录了,请注意权限问题!)。

    1)创建脚本:

    #创建脚本文件
    hzq@ubuntu:~$ sudo gedit hzqtest8.sh
    [sudo] hzq 的密码:
    #输入脚本内容
    #!/bin/bash
    for ((i = 0; i < 10; i++)); do
        sleep 2
        echo $(date)
    done
    #保存退出。
    

    2)赋予执行权限:

    hzq@ubuntu:~$ sudo chmod 755 hzqtest8.sh
    

    3、linux后台运行命令和脚本任务的例子

     下面通过6个典型的使用案例来解释各个命令的功能和使用方法。

    ● 例子1:用&

    hzq@ubuntu:~$ ./hzqtest8.sh &
    

     功能:&加在一个命令的最后,可以把当前行的命令放在后台执行。注意&前面有空格。

     这种方法中,当非正常退出当前shell终端时(包括直接叉掉、杀死、直接注销关机等),后台运行的hzqtest8.sh也会结束。这是因为脚本在后台运行时,运行脚本的父进程是当前shell终端进程,关闭当前shell终端时,会发送hangup挂断信号给子进程,子进程收到hangup信号后也就退出了。

     但是,如果用exit退出,ctrl+d退出,命令可以继续在后台运行。

    ● 例子2:用nohup和&

    为了解决上面的问题可以用下面的例子,

    hzq@ubuntu:~$ nohup ./hzqtest8.sh &
    [1] 3640
    hzq@ubuntu:~$ nohup: 忽略输入并把输出追加到'nohup.out'
    hzq@ubuntu:~$
    

     功能:命令前加上nohup可以让你退出shell之后继续运行相应的进程。nohup就是忽略当前任务挂断信号的意思。这样就解决上面的问题了。

     输入nohup命令之后会给出提示:nohup: ignoring input and appending output to ‘nohup.out’(中文版参见上文),这是正常提示,直接打回车就可以。

    • nohup默认会把标准输出重定向到默认文件nohup.out中,你可以自定义该输出文件,如下例子。
    hzq@ubuntu:~$ nohup ./hzqtest8.sh >hzqout.txt &
    [1] 3668
    hzq@ubuntu:~$ nohup: 忽略输入重定向错误到标准输出端
    
    [1]+  已完成               nohup ./hzqtest8.sh > hzqout.txt
    hzq@ubuntu:~$
    #看一下输出文件里的内容。
    hzq@ubuntu:~$ cat hzqout.txt
    2019年 10月 25日 星期五 23:37:48 CST
    2019年 10月 25日 星期五 23:37:49 CST
    2019年 10月 25日 星期五 23:37:50 CST
    2019年 10月 25日 星期五 23:37:51 CST
    2019年 10月 25日 星期五 23:37:52 CST
    2019年 10月 25日 星期五 23:37:53 CST
    2019年 10月 25日 星期五 23:37:54 CST
    2019年 10月 25日 星期五 23:37:55 CST
    2019年 10月 25日 星期五 23:37:56 CST
    2019年 10月 25日 星期五 23:37:57 CST
    
    • 如果输入nohup后不想打回车,可以用下面的例子,
    hzq@ubuntu:~$ nohup ./hzqtest8.sh >hzqout.txt 2>&1 &
    [1] 3690
    hzq@ubuntu:~$ cat hzqout.txt
    nohup: 忽略输入
    2019年 10月 25日 星期五 23:38:53 CST
    2019年 10月 25日 星期五 23:38:54 CST
    2019年 10月 25日 星期五 23:38:55 CST
    2019年 10月 25日 星期五 23:38:56 CST
    2019年 10月 25日 星期五 23:38:57 CST
    2019年 10月 25日 星期五 23:38:58 CST
    2019年 10月 25日 星期五 23:38:59 CST
    2019年 10月 25日 星期五 23:39:00 CST
    2019年 10月 25日 星期五 23:39:01 CST
    2019年 10月 25日 星期五 23:39:02 CST
    [1]+  已完成               nohup ./hzqtest8.sh > hzqout.txt 2>&1
    hzq@ubuntu:~$
    

     功能解释:2>&1 是将错误提示信息的输出 重定向到 标准输出,而这里的标准输出已经重定向到hzqout.txt文件,也就是说标准的错误提示也直接输出到out.file文件中,所以就没有提示了,也就不用再打回车了。

    • 另外,如果你的后台任务没有输出,你可以直接重定向到/dev/null

    ● 例子3:用ctrl+z、jobs和bg

    hzq@ubuntu:~$ ./hzqtest8.sh
    2019年 10月 25日 星期五 23:56:15 CST
    2019年 10月 25日 星期五 23:56:16 CST
    2019年 10月 25日 星期五 23:56:17 CST
    2019年 10月 25日 星期五 23:56:18 CST
    ^Z[3]   已完成               nohup ./hzqtest8.sh > /dev/null 2>&1
    
    [4]+  已停止               ./hzqtest8.sh
    hzq@ubuntu:~$ jobs
    [4]+  已停止               ./hzqtest8.sh
    hzq@ubuntu:~$ bg 4
    [4]+ ./hzqtest8.sh &
    hzq@ubuntu:~$ 2019年 10月 25日 星期五 23:57:04 CST
    2019年 10月 25日 星期五 23:57:05 CST
    2019年 10月 25日 星期五 23:57:06 CST
    2019年 10月 25日 星期五 23:57:07 CST
    2019年 10月 25日 星期五 23:57:08 CST
    2019年 10月 25日 星期五 23:57:09 CST
    
    [4]+  已完成               ./hzqtest8.sh
    hzq@ubuntu:~$ 
    

     功能:上面的例子中脚本命令事先已经正常执行,然后你可能发现这个任务执行时间比较长,一直独占着终端窗口的使用,很不方便。

     ctrl+z命令可以将当前的前台任务转后台,也就是放到后台任务池中了,这个时候前台窗口就变成非阻塞状态了,但是要注意转过去的任务在后台默认是冻结状态。从上面例子中可以看出任务输出了4行之后中断了。

     这个时候需要用到bg命令,bg命令的功能就是将后台冻结的任务再次运行起来,但是它需要一个任务ID号,而jobs命令就是查看所有任务状态的,包括ID号。

     例子中的bg 4就是当前任务号码。

     该例子中没有使用nohup,有需要的同学可以自行加上,包括重定向都是可以加上的。

    ● 例子4:用disown、jobs和&

     上面的例子中没有使用nohup命令,所以当终端环境强行退出时,后台正在执行的任务(作业/命令/程序/脚本)也会退出,由于各种原因你可能想事后加上nohup的功能(忽略终端关闭信号),看下面的例子。

    hzq@ubuntu:~$ ./hzqtest8.sh >hzqout.txt 2>&1 &
    [1] 7168
    hzq@ubuntu:~$ jobs
    [1]+  运行中               ./hzqtest8.sh > hzqout.txt 2>&1 &
    hzq@ubuntu:~$ disown -h %1
    hzq@ubuntu:~$ 
    

     功能:disown也是隔离终端挂断信号,但主要用于事后使用。上面执行完disown之后,你可以强行关闭终端窗口,然后等待1分钟后去查看重定向文件hzqout.txt看看有没有执行成功,如果成功里面有完整的10条信息,并且是连续的。下面的结果可以看到已经成功执行了。

    hzq@ubuntu:~$ ps -ef |grep hzqtest
    hzq        7166   7152  0 01:11 pts/1    00:00:00 grep --color=auto hzqtest
    #确认后台进程已经执行完毕退出,后面会解释用法。
    hzq@ubuntu:~$ cat hzqout.txt
    2019年 10月 26日 星期六 01:11:16 CST
    2019年 10月 26日 星期六 01:11:20 CST
    2019年 10月 26日 星期六 01:11:24 CST
    2019年 10月 26日 星期六 01:11:28 CST
    2019年 10月 26日 星期六 01:11:32 CST
    2019年 10月 26日 星期六 01:11:36 CST
    2019年 10月 26日 星期六 01:11:40 CST
    2019年 10月 26日 星期六 01:11:44 CST
    2019年 10月 26日 星期六 01:11:48 CST
    2019年 10月 26日 星期六 01:11:52 CST
    hzq@ubuntu:~$ 
    

    ● 例子5:用setsid和&

    hzq@ubuntu:~$ setsid ./hzqtest8.sh &
    [1] 3001
    hzq@ubuntu:~$ 2019年 10月 26日 星期六 16:27:09 CST
    2019年 10月 26日 星期六 16:27:11 CST
    2019年 10月 26日 星期六 16:27:13 CST
    2019年 10月 26日 星期六 16:27:15 CST
    2019年 10月 26日 星期六 16:27:17 CST
    2019年 10月 26日 星期六 16:27:19 CST
    2019年 10月 26日 星期六 16:27:21 CST
    2019年 10月 26日 星期六 16:27:23 CST
    2019年 10月 26日 星期六 16:27:25 CST
    2019年 10月 26日 星期六 16:27:27 CST
    
    [1]+  已完成               setsid ./hzqtest8.sh
    hzq@ubuntu:~$
    

     功能:setsid是重新创建一个会话进程来执行任务。setsid可以起到和nohup类似的效果,但是setsid更彻底,所以严格上说setsid不是忽略终端关闭信号,而是这个后台任务创建之后就与当前终端没有关系了,所以当前终端的关闭自然不会影响到它。

     同然的原理,大家估计已经想到了,jobs命令在这个时候是不起作用的。

     另外,和nohup还有一个区别就是,不用多打一个回车,因为它没有提示信息。

    ● 例子6:用 小括号/圆括号 和&

    hzq@ubuntu:~$ (./hzqtest8.sh &)
    hzq@ubuntu:~$ 2019年 10月 26日 星期六 23:58:26 CST
    2019年 10月 26日 星期六 23:58:28 CST
    2019年 10月 26日 星期六 23:58:30 CST
    2019年 10月 26日 星期六 23:58:32 CST
    2019年 10月 26日 星期六 23:58:34 CST
    2019年 10月 26日 星期六 23:58:37 CST
    2019年 10月 26日 星期六 23:58:39 CST
    2019年 10月 26日 星期六 23:58:41 CST
    2019年 10月 26日 星期六 23:58:43 CST
    2019年 10月 26日 星期六 23:58:45 CST
    hzq@ubuntu:~$ 
    

     功能:小括号可以起到和setsid类似的效果,小括号是创建一个独立shell来执行命令,当前的后台任务创建之后就与当前终端没有关系了,所以终端的关闭也不会影响到它。

     同然的原理,jobs命令在这个时候是不起作用的。

     另外,和setsid一样,圆括号执行命令不用多打一个回车,因为它没有提示信息。

    4、查看后台任务的命令

     常用的有jobs和ps命令,区别是jobs用于查看当前终端后台运行的任务,换了终端就看不到了(包括关闭终端再重新打开也看不到的)。而ps命令用于查看全局所有后台进程的信息,当然可以看到别的终端运行的后台任务。

    1)jobs命令
    功能:查看当前终端任务信息

    hzq@ubuntu:~$ jobs -l
    [1]-  3427 运行中               nohup ./hzqtest8.sh &
    [2]+  3445 运行中               nohup firefox &
    

    jobs -l选项可以多显示一个PID信息。
    第一列:任务序号,注意并不是PID。
    第二列:+ 号表示当前顶部任务,- 号其次任务,没符号是其他任务。
    第三列:PID(上面例子中,默认情况下没有PID)。
    第四列:状态,四种(运行中,已停止,已完成,已杀死)。
    第五列:任务名称(即刚才运行的命令)。

    2)ps命令
    功能:全局查看进程信息

    hzq@ubuntu:~$ ps -ef |grep gedit
    root       3791   2566  0 00:29 pts/0    00:00:00 sudo gedit
    root       3792   3791  0 00:29 pts/0    00:00:00 gedit
    root       3802   2566  0 00:30 pts/0    00:00:00 sudo gedit
    root       3803   3802  0 00:30 pts/0    00:00:00 gedit
    hzq        3820   2566  0 00:44 pts/0    00:00:00 grep --color=auto gedit
    

     ps命令是Process Status的缩写,功能比较强大,参数非常多,尤其与其他命令组合时可以完成很复杂的操作。
     ps -ef |grep hzqtest是常见用法之一,
     e:表示列出所有进程,f:表示输出完整格式,
     grep hzqtest:表示过滤筛选“hzqtest”关键字。
     上面例子中,第一列:用户名,第二列:PID,第三列:父级PID,最后一列:命令名称或路径

    5、关闭后台任务的命令

     处于linux后台的任务有几种关闭方式:任务运行完毕自行退出;通过交互方式退出(包括传入参数对话,界面操作,终端ctrl+c等);通过进程管理工具杀掉;关闭系统退出等。

     kill命令:属于进程管理工具,功能:杀掉进程。

    hzq@ubuntu:~$ jobs
    [2]   已停止               nohup firefox
    [3]-  已停止               nohup sudo gedit
    [4]+  已停止               nohup sudo gedit
    hzq@ubuntu:~$ kill -9 %2
    
    [2]   已停止               nohup firefox
    hzq@ubuntu:~$ jobs
    [2]   已杀死               nohup firefox
    [3]-  已停止               nohup sudo gedit
    [4]+  已停止               nohup sudo gedit
    hzq@ubuntu:~$ jobs
    [3]-  已停止               nohup sudo gedit
    [4]+  已停止               nohup sudo gedit
    
    • 1)上面的例子中先通过jobs命令查看任务号,然后通过任务号%N杀死进程!最后再次查询发现jobs中的任务已经减少了。
    hzq@ubuntu:~$ ps -ef |grep gedit
    root       3791   2566  0 00:29 pts/0    00:00:00 sudo gedit
    root       3792   3791  0 00:29 pts/0    00:00:00 gedit
    root       3802   2566  0 00:30 pts/0    00:00:00 sudo gedit
    root       3803   3802  0 00:30 pts/0    00:00:00 gedit
    hzq        3829   2566  0 00:59 pts/0    00:00:00 grep --color=auto gedit
    hzq@ubuntu:~$ sudo kill -9 3791
    [sudo] hzq 的密码: 
    [3]-  已杀死               nohup sudo gedit
    hzq@ubuntu:~$ ps -ef |grep gedit
    root       3792    912  0 00:29 pts/0    00:00:00 gedit
    root       3802   2566  0 00:30 pts/0    00:00:00 sudo gedit
    root       3803   3802  0 00:30 pts/0    00:00:00 gedit
    hzq        3835   2566  0 01:01 pts/0    00:00:00 grep --color=auto gedit
    
    • 2)上面的例子中先通过ps命令查看任务PID,然后通过PID杀掉进程,注意上面例子中使用了管理员权限。
    • 3)如果你的任务还没有转到后台运行,那么直接Ctrl+c 就可以终止了。或者你也可以将后台任务转到前台然后执行ctrl+c来终止。该方法可参考下面举例。

    6、前后台任务的转换

    1)fg命令
    功能:将后台中的任务调至前台并继续运行。

    hzq@ubuntu:~$ jobs
    [1]-  运行中               nohup gedit &
    [2]+  运行中               nohup ./hzqtest8.sh &
    hzq@ubuntu:~$ fg 1
    nohup gedit
    

    先通过上面介绍的jobs命令查看任务信息,然后用fg N将选中的任务调到前台,跳到前台之后终端界面被阻塞,此时终端不能做别的事情了。

    2)Ctrl + z 命令
    功能:将正在前台执行的命令作业放到后台,并冻结运行状态。

    hzq@ubuntu:~$ ./hzqtest8.sh
    2019年 10月 27日 星期日 01:53:31 CST
    2019年 10月 27日 星期日 01:53:33 CST
    ^Z
    [3]+  已停止               ./hzqtest8.sh
    hzq@ubuntu:~$ jobs
    [3]+  已停止               ./hzqtest8.sh
    

    例子中先正常运行任务脚本,可以看到刚开始是正常输出的,执行ctrl+z之后,提示任务已停止,用jobs查看任务已在后台并处于停止状态。

    3)bg命令
    功能:将后台冻结的任务再次运行起来,运行后任务还在后台。

    hzq@ubuntu:~$ jobs
    [1]+  已停止               ./hzqtest8.sh
    hzq@ubuntu:~$ bg 1
    [1]+ ./hzqtest8.sh &
    hzq@ubuntu:~$ 2019年 10月 27日 星期日 01:58:17 CST
    2019年 10月 27日 星期日 01:58:19 CST
    2019年 10月 27日 星期日 01:58:21 CST
    
    [1]+  已完成               ./hzqtest8.sh
    

    上面例子中先用jobs查看有一个任务处于后台停止状态,执行bg 1之后任务继续在后台运行,并继续输出剩余信息。

    最后

     本文以Ubuntu18为测试环境,其他linux版本包括centos、redhat等大多数应该是没问题的,这些命令都是linux通用的命令,如果有细微的效果差异可能是版本和环境的问题,自己可以尝试调整一下。

     另外screen工具也是任务管理常用的工具,它的功能也比较强大,screen是一个屏幕任务进程管理器,也可以将多个任务作业转到后台运行,它是第三方工具,Ubuntu标配没有这个工具,需要另外安装,所以这里就不多说了,有兴趣的朋友可以自己研究一下。(如果有三个以上同学留言需要screen的文章我将再写一篇screen的使用案例介绍哈:)

     欢迎交流分享,讨论补充~ ~

    参考文章《Ubuntu桌面启动后自动执行指定的命令或程序的三种方法》
    参考文章《vmware虚拟机运行速度卡慢原因分析及解决办法大全(一)》

    转载请注明本文地址:https://blog.csdn.net/davidhzq/article/details/102766881

    展开全文
  • uniapp后台运行

    千次阅读 2021-05-16 09:47:59
    uniapp后台运行 加载main.js任意位置 let main = plus.android.runtimeMainActivity(); //为了防止快速点按返回键导致程序退出重写quit方法改为隐藏至后台 plus.runtime.quit = function() { main.moveTaskToBack...
  • docker容器的前台后台运行

    万次阅读 2021-06-22 20:29:46
    文章目录容器运行时的 -dit 选项默认:前台运行,stdout 和 stderr 转接出来,而stdin关了前台 -t前台 -i前台 -itdetach模式前后台切换--attach-i 和 -a注:bash 镜像 容器运行时的 -dit 选项 2021-06-22 docker run...
  • Linux命令后台运行

    千次阅读 2021-07-17 11:04:51
    Linux后台运行命令有两种方式: cmd & : 后台运行,关掉终端会停止运行 nohup cmd & : 后台运行,关掉终端不会停止运行 方式一:cmd & cmd & 实现让命令在后台运行。但不要将有用户交互的命令...
  • 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&amp;amp;命令。 (1)&amp;amp;命令 功能:加在一个命令的最后,可以把这个命令放在后台执行 ...
  • npm 后台运行

    千次阅读 2019-09-11 21:52:50
    pm2(推荐) 官网地址:...npm install -g pm2 pm2 start scripts/start.js // 启动 pm2 start scripts/start.js -i max //启动 使用所有CPU核心的集群 pm2 stop scripts/start.js // 停止 pm2 stop all ...
  • 1:我们这边是否关机不影响服务器的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼) 2:让程序在后台跑后,不会占据终端,我们可以用...
  • 保持matlab进程在Linux服务器后台运行

    千次阅读 2020-04-23 05:04:02
    本文主要分为两部分,分别为matlab命令行启动和Linux服务器后台运行,后者可用于各种后台运行程序,如matlab、python等。 由于疫情而远程办公的缘故,笔者最近经常用到Linux服务器。利用SSH协议可很方便地通过自己的...
  • ios后台运行

    千次阅读 2019-04-24 11:02:14
    作者:pandora的技术博客 ...一,后台任务的分类 ...Not Running, 未运行 Inactive, 非活动 Active, 活动 Background, 后台 Suspend, 挂起 对应的方法分别是: // 进程启动但还没完成初始化,这个方法是...
  • CE实现植物大战僵尸后台运行

    千次阅读 2020-01-07 20:42:51
    植物大战僵尸(汉化第一版)CE修改后台运行 windows10系统下实现植物大战僵尸后台运行。 修改的思路:游戏运行时植物冷却正常进行,游戏暂停时冷却暂停。 找到卡槽冷却时间的数据地址 选择冷却时间比较长的土豆...
  • python后台运行框架

    千次阅读 2019-08-22 11:49:02
    以下是测试demo,如有错误还请指正,运行错误还望自行解决,谢谢! 启动方法: 1. 前台运行:python main....2. 后台运行:python main.py start (config.py->options->debug->'False') main.py #codin...
  • 后台运行 VirtualBOX

    千次阅读 2018-07-28 16:04:19
    如何后台运行虚拟机 作为软件开发人员。虚拟机是必不可少的,Oracle VM VirtualBOX由于其体积小,性能强,而且还免费,占用了相当的大用户群体。 在实际使用中,作为一个软件开发人员,一个电脑上可能会安装多个...
  • 后台运行脚本命令

    千次阅读 2018-07-28 10:56:43
    在应用Unix/Linux时,我们一般想让某个程序在后台运行,nohup ./start-mysql.sh & 该命令的一般形式为:nohup command & 在缺省情况... storm安装小记 shj1119 09-28 1243 1 所需安装软件 0.8系列...
  • 正常情况下,使用应用时,当用户按下home键,APP便被挂起(线程和runloop都会暂时挂起),但是依然驻留在内存中,这种状态下,如果不使用苹果允许的那几种一直在后台运行的方法(如播放音乐、定位等),程序便会被挂起,...
  • ios长时间后台运行 无声音乐播放加VOIP 非常强大 对于不上线的项目来说 福利来了
  • 通过Xshell工具连接远程阿里云服务器后,如何运行python程序呢?这个大家都知道,python命令啦。 举个栗子:通过Xshell在某个目录下输入命令:python test.py就执行了test.py这个程序。 但是如果我这个test.py要...
  • 一、为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。...1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那
  • 让 Chrome 在后台运行

    万次阅读 2019-11-15 09:45:53
    如何让谷歌浏览器(google chrome)在后台运行 打开谷歌浏览器(google chrome),点击小编红框标记位置,点击设置: 用鼠标下滑到最底部,点击显示高级设置: 继续滚动鼠标到最底部,勾选 “关闭 google chrome 后...
  • 经常遇到某些程序在windows系统下,需要dos命令才可以运行,但是一直启动显示CMD.EXE窗口也不太好看,所以希望能将DOS窗口隐藏在后台运行。解决方法:将dos命令写成bat批处理文件,然后进行以下操作。   bat文件...
  • 如何让一个应用程序一直在后台运行? - C++ Builder - Windows SDK-API.mht

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 851,554
精华内容 340,621
关键字:

后台运行