首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Shell: Fork (daemonize)子Shell,使其在tmux会话终止后仍能存活

Shell是一种命令行解释器,用于与操作系统进行交互。Fork是Shell中的一个命令,用于创建一个子Shell进程。子Shell是指在当前Shell会话中创建一个新的Shell进程,该进程可以独立运行,并且在父Shell会话终止后仍然保持活动状态。

Daemonize是指将一个进程转变为守护进程(daemon),守护进程是在后台运行的一种特殊进程,通常不与终端交互,而是在系统启动时自动启动,并在系统运行期间持续运行。

在Shell中,通过使用Fork命令和一些其他的系统调用,可以实现将子Shell进程转变为守护进程的功能,即将子Shell进程daemonize。这样,即使父Shell会话终止,子Shell进程仍然可以继续在后台运行。

子Shell的daemonize过程通常包括以下步骤:

  1. 创建一个子Shell进程。
  2. 在子Shell进程中调用Fork命令,创建一个子进程。
  3. 在子进程中调用setsid函数,创建一个新的会话,并成为该会话的首进程。
  4. 关闭子进程中的标准输入、标准输出和标准错误输出,以避免与终端交互。
  5. 将当前工作目录切换到根目录,以避免占用文件系统。
  6. 重新打开标准输入、标准输出和标准错误输出,将它们重定向到/dev/null或其他文件。
  7. 执行守护进程的具体逻辑。

通过将子Shell进程daemonize,可以实现在tmux会话终止后仍然保持活动状态的效果。这对于需要在后台持续运行的任务非常有用,例如服务器进程、定时任务等。

腾讯云提供了一些相关的产品和服务,可以帮助实现Shell的Fork子Shell进程并进行daemonize的功能。例如,可以使用腾讯云的云服务器(CVM)来创建和管理虚拟机实例,通过在虚拟机中执行Shell命令来实现Fork和daemonize操作。此外,腾讯云还提供了云函数(SCF)和容器服务(TKE)等产品,可以用于运行和管理后台任务和守护进程。

更多关于腾讯云相关产品和服务的信息,可以访问腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python守护进程daemon实现

1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,系统关闭时终止,没有控制终端,在后台运行。...2、调用fork,然后使父进程exit。这样做,使得当我们以./的shell命令启动守护进程时,父进程终止会让shell认为此命令已经执行完毕,而且,这也使进程获得了一个新的进程ID。...7、忽略SIGCHLD信号    这一步并非必须的,只对需要创建进程的守护进程才有必要,很多服务器守护进程设计成通过派生子进程来处理客户端的请求,如果父进程不对SIGCHLD信号进行处理的话,进程终止变成僵尸进程..._exit(1) # 进程, 由于父进程已经退出,所以进程变为孤儿进程,由init收养 '''setsid使进程成为新的会话首进程,和进程组的组长,与原来的进程组、控制终端和登录会话脱离...os.setsid() #setsid调用成功,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。

7.5K30

Linux:如何在脚本开发中实现程序在用户退出仍保持运行

Linux环境下进行脚本开发时,常常需要自主管理进程,确保某些关键程序在用户退出仍能继续运行,而不依赖于systemd这样的进程管理工具。本文将探讨如何通过其他方法实现这一目标。.../my_script.sh & 使用tmux或screen工具 tmux和screen是两个流行的终端复用工具,它们可以创建一个持久的会话会话中运行的程序不会因为用户退出而终止。...比较与推荐 tmux 和 screen tmux(Terminal Multiplexer) tmux 是一种终端复用工具,允许用户一个终端窗口内运行多个终端会话。...它的主要优点包括: 会话管理:tmux 可以创建、分离和重新连接会话,使得程序可以不同的会话中独立运行而不会因为终端关闭而中断。...窗口分割:tmux 允许一个终端窗口中分割成多个窗格,每个窗格都可以运行独立的终端会话,这对于并行处理任务非常有用。 脚本友好:tmux 提供丰富的命令行选项,可以方便地脚本中使用。

36810
  • 13(守护进程)

    13.2 守护进程的特征 守护进程是一种纯粹的后台进程,与运行前环境完全隔离,包括未关闭的文件描述符、控制终端、会话、进程组、工作目录以及文件创建掩码等 很多守护进程是父进程 fork 产生...,所以会继承所有的父进程地址空间中的环境,所以必须在守护进程诞生之初,断绝这些相关环境,当然,守护进程也可以 linux 系统启动时从启动脚本 /etc/rc.d 中启动,也可以由 crontab 启动...这样做实现了以下两点:第一,如果该守护进程是通过shell命令启动的,那么父进程终止使得shell认为该命令已执行完毕。...第二,进程继承了父进程的进程组ID,但有一个新的进程ID,这就保证了进程不是组长进程。...让守护进程不再担当会话组长,防止他重新打开终端 if ((pid = fork()) < 0) { perror("fork"); exit(-1);

    79310

    Linux - 请允许我静静地后台运行

    组长进程创建了进程组,但它并不能决定进程组的存活时间,只要进程组内还有一个进程存在,进程就存在,与组长进程是否已终止无关。...这是因为用户注销或者网络断开时,SIGHUP信号会被发送到会话所属的进程,而此 SIGHUP 的默认处理方式是终止收到该信号的进程。所以若程序中没有捕捉该信号,当终端关闭会话所属进程就会退出。...它实际上是会话中开启了一个后台作业,对作业的操作我们后面再说。 但我们会发现,如果此时终端被关闭,进程还是会退出。...而在 shell 脚本内,setsid 不是进程组长,它不会 fork() 进程,而是由 bash 来fork() 一个进程,而 bash 会 wait() 进程,所以表现得像 setsid ...创建过程 要创建一个守护进程,步骤为: 必选项 fork 进程,退出父进程,进程作为孤儿进程被 init 进程收养; 使用 setsid, 打开新会话,进程成为会话组长,正式脱离终端控制; 设置信号处理

    1.7K50

    如何在后台运行Linux命令

    一个后台进程就是说一个进程/命令终端启动,运行在后台,并且不会和用户发生任何交互。 在这篇文章中,我们将会讨论 Linux 中的后台进程。...02.通过输入bg将停止进程移动到后台去 保持后台进程运行直到 Shell 退出 如果你丢失了连接,或者你退出了 Shell 会话,后台进程将会被终止。...替代方案 有一些程序允许你同一时间拥有多个非交互会话。... Screen 中运行的进程,即便窗口不可见,甚至你失去连接,它们依然会运行。 Tmux Tmux 是一个现代化的 GNU 屏幕交互程序。...通过 Tmux,你可以创建一个会话,然后再会话中打开多个窗口。Tmux 会话是持久性的,这意味着即便你关闭了终端,这些 Tmux 上运行的程序依然会运行。

    8.1K20

    进程ID及进程间的关系

    亲属关系 进程通过 fork() 创建出一个进程,就形成来父子关系,如果创建出多个子进程,那么这些进程间属于兄弟关系。可以用 pstree 命令查看当前系统的进程树。...当一个进程创建了进程,它应该通过系统调用 wait() 或者 waitpid() 等待进程结束,回收进程的资源。而进程结束时,会向它的父进程发送 SIGCHLD 信号。...总之,进程都有父进程,负责进程结束的资源回收。进程退出且父进程完成回收前,进程变成僵尸进程。僵尸进程持续的时间通常比较短,父进程回收它的资源就会消亡。...如果父进程没有处理进程的终止,那么子进程就会一直处于僵尸状态。 会话、进程组关系 Linux 系统中可以有多个会话(session),每个会话可以包含多个进程组,每个进程组可以包含多个进程。...会话是用户登录系统到退出的所有活动,从登录到结束前创建的所有进程都属于这次会话。登录第一个被创建的进程(通常是 shell),被称为 会话 leader。 进程组用于作业控制。

    57123

    Linux 守护进程|应急响应

    Linux中: 打开terminal,也就是终端程序,之后可以获得一个shell 通过ssh连接到linux的ssh-server 服务器,也可以获得一个shell 通常我们都是通过以上两种方式来获得一个...shell,之后运行程序的,此时我需要纠正一个概念,我们通常都说获得一个shell,本质上来说,我们获取了一个session(会话,以下session都是会话) ?...之所以要做这一步是因为下面两个原因: 假设daemon是从命令行启动的,父进程的终止会被shell发现,shell发现之后会显示出另一个shell提示符并让进程继续在后台运行。...或者更简单地说,setsid()调用之后执行第二个fork(),然后再次让父进程退出并让孙子进程继续执行。...这样就确保了进程不会成为会话组长,因此根据System V中获取终端的规则,进程永远不会重新请求一个控制终端。(多一个fork()调用不会带来任何坏处。)

    3.8K30

    Tmux 速成教程:技巧和调整

    本文将先介绍 Tmux 是什么,然后讲解如何使用 Tmux,才能使其同 Vim 结合起来,打造出更高效、更优雅的终端工具。...从图中我们可以看出: 左侧:Vim 右侧:系统 Shell 左下方:Tmux 会话的名字(“pomodoro-app”) 下方的中部:当前会话中的 Tmux 窗口(“app log”、“editor”和... Tmux会话中,现有的窗口将会列屏幕下方。下图所示的就是默认情况下 Tmux 列出现有窗口的方式。这里一共有三个窗口,分别是“server”、“editor”和“shell”。 ?...而且还可以通过把 Tmux 设为 vi 模式,使其与 Vim 的操作更加接近。为此,需要将以下配置加入到文件 ~/.tmux.conf 中。...开发过程中,经常要创建 Tmux 会话会话中包含“server”、“editor”(用于编写代码)和“shell”(用于运行系统命令)这 3 个窗口。

    3.9K100

    Python实现守护进程

    进程,退出父进程 2、进程变更工作目录(chdir)、文件权限掩码(umask)、进程组和会话组(setsid) 3、进程fork孙子进程,退出进程 4、孙子进程刷新缓冲,重定向标准输入...父进程之所以退出,是因为终端敲击键盘、或者关闭时给它发送了信号;而fork出来的进程,父进程自杀成为孤儿进程,进而被操作系统的init进程接管,因此脱离终端控制。...因为进程现在是会话组长了(对话期的首次进程),有能力打开控制终端,再fork一次,孙子进程就不能打开控制终端了。...另外,sh(Bourne Shell)不支持会话机制,因为会话机制需要shell支持工作控制(Job Control)。 守护进程与后台进程 通过&符号,可以把命令放到后台执行。...3、守护进程改变了会话、进程组、工作目录和文件描述符,后台进程直接继承父进程(shell)的 换句话说:守护进程就是默默地奋斗打拼的有为青年,而后台进程是默默继承老爸资产的富二代。

    2K80

    【5分钟玩转Lighthouse】开车也能跑程序

    lh.png 我们创建完成,可以实例列表页面看到实例状态,当实例状态为运行中时,点击更多->管理即可进入管理页面了。...0x02 初体验 首先需要明确,通过程序命令添加&执行是完全达不到效果的,因为这只是设置再当前shell中后台运行而已,程序的进程仍然是当前shell进程,在当前shell退出(如Ctrl+D或断网时...再次登录可以验证。 0x03 tmux工具 tmux简介 tmux(terminal multiplexer)是一个终端分屏工具,它可以很方便地进行服务器端多窗口地管理。...:它的连接会话都保存在服务器端,每个tmux会话可以从屏幕终端分离解绑(detach),后续如果需要,可以随时将这个进行中的会话绑定(attach)到任何新的屏幕终端,即恢复。...编译Linux内核的过程通常是冗长的,对于一般的笔记本通常要数个小时,虽然云服务器上可以加速,但也是一个相当长时间的任务。这类工作很适合结合tmux这类终端会话工具来完成。

    4.7K4316

    Linux笔记(10)| 进程概述

    fork函数 pid_t fork(void) 父进程返回正整数,进程返回0,执行fork函数之前,操作系统只有一个进程,fork函数之前的,代码只会被执行一次,执行fork函数之后,操作系统有两个几乎一样的进程...WIFEXITED:宏用来判断进程是否正常终止(return、exit、_exit退出),如果子进程正常退出,则该宏为真 WIFSIGNALED:宏用来判断进程是否非正常终止(被信号所终止) WEXITSTATUS...:宏用来得到正常终止情况下的进程返回值的 几个概念 进程组 作用:对相同类型的进程进行管理 进程组的诞生 Shell里面直接执行一个应用程序,对于大部分进程来说,自己就是进程组的首进程,进程组只有一个进程...pid决定 会话 作用:管理进程组 会话的诞生 调用setsid函数,新建一个会话,应用程序作为会话的第一个进程,称为会话首进程 用户终端正确登录之后,启动shell时linux系统会创建一个新的会话...前台进程组的首进程会占用会话所关联的终端来进行,shell启动其他应用程序时,其他程序成为首进程 后台进程组 后台进程中的程序是不会占用终端shell进程里启动程序时,加上&符号可以指定程序运行在后台进程组里面

    67610

    Linux终端复用神器-Tmux使用梳理

    支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活、动态的进行各种布局和操作。...$ brew install tmux 3)Tmux的使用 安装完成输入命令tmux即可打开软件,界面十分简单,类似一个下方带有状态栏的终端控制台;但根据tmux的定义,开启了tmux服务器...列出所有快捷键;按q返回 d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 D 选择要脱离的会话同时开启了多个会话时使用 Ctrl+z 挂起当前会话...r 强制重绘未脱离的会话 s 选择并切换会话同时开启了多个会话时使用 : 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 [ 进入复制模式;此时的操作与vi/emacs...然后按enter键就会恢复到shell终端状态 ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话

    1.6K100

    详解Linux中的守护进程

    fork创建的进程和⽗进程同⼀个进程组中,进程组的Leader必然是该组的第⼀个进程,所以进程不可能是该组的第⼀进程,进程中调用setsid就不会有问题了。...(如果该守护进程作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。同时保证该进程不是一个进程组的组长进程) 3、调用setsid创建一个新会话。...第一次fork的作用是:1、让shell认为这条命令已经终止,不用挂在终端输入上; 2、为之后的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork进程,则此时的父进程是进程组组长...(当进程调用完setsid函数之后,进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。)...只有确定会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程。

    3.8K43

    打造高效前端工作环境-tmuxinator

    前言  虽然tmux能让我们方便组织工作环境,但每次重新打开会话时都需要手动重新创建窗口、窗格和执行各种程序,能不能像VS那样以工程为单位保存窗口、窗格和各种所需执行的程序的信息呢?...http://gems.ruby-china.org/ $ gem sources -l  安装Tmuxinator $ gem install tmuxinator  配置别名mux和tmuxinator命令智能补全...2.打开项目(i.e.根据项目配置启动tmux会话),mux 或mux s 示例: $ mux demo 然后tmuxinator就会创建一个...tmux会话,并根据刚才编辑的配置文件创建窗口和窗格 3.关闭项目(i.e.根据项目配置关闭tmux会话),mux st 示例:tmux某个shell中输入 $ mux...调用set $ws="repos/demo/" && mux demo 3.设置开发环境上下文  项目配置文件中加入pre_window配置项。

    1.4K100

    日拱一卒,量大管饱,MIT手把手教你配环境

    注意,Ctrl终端中会被展示成^。 img 尽管SIGINT和SIGQUIT都是常用的终止程序的终端请求,一个更常用的用来停止程序的信号是SIGTERM。...目前最流行的终端多路复用器是tmuxtmux可以高度定制,通过组合键可以创建多个tab和pane以及快速它们之间导航。 tmux希望你可以记住它的组合键,通常是x的格式。...tmux当中的结构如下; 会话 - 每个会话都是一个独立的工作区,其中包含一个或多个窗口 tmux 开始一个新的会话 tmux new -s NAME 以指定名称开始一个新的会话 tmux ls 列出当前所有会话... tmux 中输入d ,将当前会话分离 tmux a 重新连接最后一个会话。...然而如果我们换一个bash的会话这种方法就行不通了,因为wait只会在进程当中能够运行。我们note当 中没有讨论到的一点是kill命令成功时会返回0,失败会返回非0。

    1.4K20

    Linux 中的 Process Group 和 Session

    按照这个思路出发, fork 之后, 如果按下 Ctrl-C 应该只有主进程会关闭, 而进程应该继续运行, 实际上并不是这样的, 两个进程都收到了 SIGINT 信号. import os import...进程可以理解为 "进行中的程序", Linux 上可以通过 fork 来创建新的进程, 然后可以使用 exec 来进程或者父进程中执行新的程序....当一个进程 fork 的时候, 进程默认是和父进程同一个进程组的. 从 shell 中启动一个进程的时候, shell 会给这个进程设置为一个新的进程组....一般来说 shell 中, session leader 就是 shell 本身....答案是: shell 会向session的所有进程组发送 SIGHUP 信号, 所以运行中的后台进程组也会退出. daemonize Unix 的上古时期, 没有 Process Manager 这个概念

    1.7K20

    如何让程序真正地在后台运行?

    shopt -s huponexit #shopt -u huponexit 设置为off $ shopt |grep onexit huponexit on 一旦终端退出(ctrl+D),...调用fork,创建进程,并且父进程退出 调用setdid创建新的会话(一个或多个进程组的集合),由于当前进程不是一个进程组的组长,因此会创建一个新的会话,却成为组长进程,同时没有控制终端。...(fork的介绍中,我们说到,儿子从父亲那里继承了很多东西) 重新设置权限掩码,避免受父进程影响 创建新的会话,脱离终端 使用新的工作目录 关闭不需要的文件描述符 关闭标准输入,标准输出和标准错误 所以通过这些也可以明白...为了保留printf的输出,我daemonize函数中,并没有关闭所有的文件描述符,0,1,2可以参考《如何理解 Linux shell中“2>&1”?》...总结 以上就进程后台运行以及是守护进程实现的介绍,关键点有 创建进程,父进程退出 创建新的会话,脱离终端 附上daemon的源码: int daemon(nochdir, noclose) int

    2.5K20

    PHP 编写守护进程

    很多守护进程系统引导的时候启动,并且一直运行直到系统关闭。另一些只需要的时候才启动,完成任务就自动结束。...创建步骤 创建进程,终止父进程 由于守护进程是脱离控制终端的,因此首先创建进程,终止父进程,使得程序 shell 终端里造成一个已经运行完毕的假象。...之后所有的工作都在进程中完成,而用户 shell 终端里则可以执行其他的命令,从而使得程序以僵尸进程形式运行,形式 I 上做到了与控制终端的脱离。...调用 fork 函数时,进程全盘拷贝父进程的会话期 (session,是一个或多个进程组的集合)、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来.../终止父进程 exit('parent process'); } //进程中创建新的会话 if (posix_setsid()

    1.7K20

    tmux-初探

    session-name 会话中切换 control+b,再按s 显示会话列表,再进行会话切换 销毁所有会话并停止tmux tmux kill-serverG 复制粘贴 Ctrl+b [...然后按enter键就会恢复到shell终端状态 ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 tmux的常规运维命令...然后按enter键就会恢复到shell终端状态 ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 ​``` tmux...然后按enter键就会恢复到shell终端状态 ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 ​``` tmux...然后按enter键就会恢复到shell终端状态 ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 ​``` tmux

    1K30
    领券