1. 名词解释

名词(中文)

名词(英文)

解释

会话

Session

每打开一次终端(本地或远程)登录Linux,都会生成一个新的会话;除此之外,程序中也可以调用函数setsid创建一个新的会话;脚本也可以调用命令setsid创建一个新的会话。新建的会话无控制终端。

会话ID

SessionID

用来标识一个会话,同一时刻不同会话的ID不会相同,是一个int类型的整数值。

用户

User

指能登录Linux的用户帐号

用户ID

UserID

用来唯一标识一个用户

伪终端或叫虚拟终端

pty

(Pseudo Terminal)

控制终端

tty

(Teletypewriter或Teletype)

字符型设备

pts

(pseudo-terminal slave)

pty的实现方法,分两端:一端叫master,另一端叫slave。可打开的最多pts数为/proc/sys/kernel/pty/max,当前已打开的pts数为/proc/sys/kernel/pty/nr。

2. 什么是守护进程?

在后台运行的进程不一定是守护进程!一个进程要成为守护进程,必须做到以下两点:

1) 在后台运行

2) 脱离了终端

2.1. 后台运行

要使一个进程在后台运行,代码中可以通过fork子进程来实现,而命令行或脚本中可以通过使用“&”来实现。

fork之后,子进程会继承父进程的SessionID,调用execve()后的进程的SessionID不会改变。

2.2. 解释关系

子进程从父进程继承了:SessionID、进程组ID和打开的终端。子进程如果要脱离这些,代码中可通过调用setsid来实现。,而命令行或脚本中可以通过使用命令setsid来运行程序实现。setsid帮助一个进程脱离从父进程继承而来的已打开的终端、隶属进程组和隶属的会话。

需要注意,代码中调用setsid是有条件的:即调用进程自己不能是进程组长。因此,调用setsid之前需要先fork,然后由产生的子进程调用setsid。

3. 以“&”方式运行有何问题?

以“&”方式可以将一个前台进程以后台方式运行,但是如果它是一个终端的job,则如果向终端收到SIGHUP信号,终端也会向它的所有job发送SIGHUP,这样以“&”方式运行的进程则会因为收到SIGHUP则退出。

当用户注销(logout)或者网络断开时,终端会收到 SIGHUP(hangup)信号从而关闭其所有子进程。

早期的Unix,终端通过Modem和系统通讯,当用户注销(logout)时,Modem就会挂断(hangup)电话;当Modem断开时,会给终端发SIGHUP来通知终端关闭所有子进程。

4. setsid&setuid

setsid命令或函数

setuid函数(相对应的命令为chmod)

1) 创建一个会话

2) 调用进程将成为会话的组长

3) 调用进程将成为进程组的组长

4) 调用进程将脱离控制终端(tty)

5) 会话ID和进程组ID都和调用进程的PID相同

1) 设置调用进程的真实用户ID、有效用户ID和保存用户ID

按下“ctrl+z”会触发SIGTSTP,注意不是SIGSTOP,这两个信号的区别是前者可以捕获,而后者不可以。进程收到这两个信号后,都进入STOP状态,使用ps aux看到的状态值为“T”,可以通过发送信号SIGCONT重新回到运行状态。

4.1. setuid应用场景

1) 以root启动,但以其它用户身份运行,常见于Webserver,因为需要监听80端口,不得不以root启动,但root权限过大,因此运行经常会从root切换到nobody等用户;

2) 开发中经常需要让非root用户能够去gdb一些root启动的进程,这个时候只开放gdb等少数一些命令给非root用户。

5.让shell脚本后台运行的方法

当使用ssh连接到服务器运行程序时,用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。但这往往不是我们想要的结果。为了避免这种情况的发生,让程序能够在服务器上正常运行,的解决办法就有两种途径:

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

nohup … &

nohup命令用途就是让提交的命令忽略HUP信号;&命令用途是让提交的命令在后台运行。同时使用nohup ... &可以让提交的命令忽略HUP信号,并将该命令放在后台运行。

e.g.:nohup sh big_task.sh > big_task.log 2>&1

Q:nohup 和 nohup … & 的区别?

A:nohup仅表示让提交的命令忽略hangup信号,但该命令仍然在前台运行,当前的shell会被阻塞,无法继续进行操作。但可以通过 ctrl-z将当前的命令挂起到后台,然后再使用bg命令让其在后台运行,这样就可以达到和使用nohup ... &同样的效果

Q:仅使用 & 命令会如何?

A:仅使用&命令仅会将命令放在后台执行,但仍然可能会受到HUP信号的影响。但此时可以通过使用disown -h命令让其忽略HUP信号

setsid

setsid可以让提交的命令在一个新的session中运行,新的进程不属于接受hangup信号的终端的子进程,这样即使ssh连接中断,新的进程也不会受到影响。

screen

screen可以用来创建一个新的session,它不属于ssh连接进程的子进程,因而不需要费心考虑HUP信号。

jobs

通过以下命令,我们可以对放入到后台的命令进行控制

查看当前终端下的后台进程:
直接执行:jobs

将查看到的某个后台进程放回到前台:
直接输入:fg %jobid //这里的jobid是通过jobs命令中看到的进程前[]中的数字。

将当前正在前台运行的进程放到后台运行:
先敲下快捷键:ctrl +z //暂停当前正在运行的进程。
再执行:bg

终止当前正在前台运行的进程:
直接敲下快捷键:ctrl +c

disown

亡羊补牢,为没有使用nohup与setsid的进程加上忽略HUP信号的功能。
使用方法:
将当前正在前台运行的进程放到后台运行(ctrl+z和bg);
然后执行disown -h %jobid //这里的jobid是通过jobs命令中看到的进程前[]中的数字。

Shell脚本:后台运行相关推荐

  1. linux打开pythonshall,linux系统shell脚本后台运行python程序

    python开发的同学们应该都知道怎么样去启动一个python应用,但是一旦我们把python应用部署到linux服务器上该如何启动呢? 方式①:就是使用进程管理工具,比如supervisor.想了解 ...

  2. Shell的后台运行()与nohup

    shell的后台运行(&)与nohup 简述 在shell脚本中当我们需要把一个任务放在后台运行时,通常我们会使用&符号: subcommand & 此时主进程会继续往下执行, ...

  3. Linux环境python脚本后台运行

    python 脚本后台运行 在服务器端一直运行一个Python脚本,当然就想到了在命令后面加&符号,代码如下: $ python /data/python/server.py >pyth ...

  4. PyCharm编写shell脚本无法运行

    背景 我们常常选择使用PyCharm在本地(Windows)进行开发,然后将文件远程同步到远程服务器(Linux)运行程序,但是这样编写的shell脚本常常无法运行,出现语法错误,因为好几个朋友和我提 ...

  5. linux shell 在后台运行命令

    linux shell 在后台运行命令: http://blog.csdn.net/CAIYUNFREEDOM/article/details/6339390 http://blog.sina.com ...

  6. shell脚本配置运行python程序,小技巧之 Linux 软连接的使用

    shell脚本配置运行python程序,小技巧之 Linux 软连接的使用 实验室的多位博士会在同一台机器上跑python程序,主流的跑程序的方法有两种 使用sh脚本配置路径和程序 直接激活conda ...

  7. linux shell 后台执行脚本的方法 脚本后台运行 后台运行程

    我的环境ubuntu 20.04 借鉴 https://blog.csdn.net/ruiyelp/ 方法1: 切断当前的连接后脚本自动断掉 直接在后台运行脚本:./test.sh & 查看当 ...

  8. Python脚本后台运行的几种方式

    最近写了监控服务的脚本,需要在后台24小时运行. 环境:linux.脚本python.shell脚本 方法一:脚本后加& 加了&以后可以使脚本在后台运行,这样的话你就可以继续工作了.但 ...

  9. python调用脚本后退出但是保持脚本运行_Python脚本后台运行的几种方式

    待验证 最近写了监控服务的脚本,需要在后台24小时运行. 环境:linux.脚本python.shell脚本 方法一:脚本后加& 加了&以后可以使脚本在后台运行,这样的话你就可以继续工 ...

  10. Windows可执行脚本后台运行脚本

    目录 脚本说明: 代码内容: 执行方法: 后言 脚本说明: 1.使用java.python 写的一些小脚本,或者一些轻量级的服务,通过cmd窗口运行时,如何让它在后台运行的解决办法. 2.可支持所有的 ...

最新文章

  1. MySQL实时复制成为可能?
  2. JavaScript创建对象的方法
  3. python格式化字符串_Python笔记7:三种方式构建字符串-格式化
  4. s6-9 TCP 定时器
  5. C#调用百度地图API入门解决BMap未定义问题
  6. UltraGrid中实现下拉Grid(UltraDropDown)
  7. python 调用mysql_Python调用Mysql
  8. Error response from daemon:###unable to delete ### (must be forced) - image is being used by stopped
  9. js 中堆和栈的应用与理解
  10. Linux编译和下载嵌入式实验,嵌入式实验6交叉编译及Linux简单程序设计实验
  11. TFS2010物理迁移workspace恢复
  12. arduino控制雨滴传感器
  13. 西南科技大学OJ题 插入排序算法实现1016
  14. AI图片翻译助手软件FAQ
  15. 伍斯特理工学院计算机科学硕士,2020年伍斯特理工学院排名TFE Times美国最佳计算机科学硕士专业排名第100...
  16. 关于网络口碑研究小组
  17. Python教你从0搭建微信推送斗鱼直播提醒(单房间简化版)
  18. 自学python需要什么书籍-关于 Python 的经典入门书籍有哪些?
  19. wework oracle,氪空间总裁钟澍:中国联合办公已经不需要再去效仿WeWork
  20. SAP ABAP——SAP简介(一)【SAP发展历程】

热门文章

  1. 薄膜键盘驱动(STM32)
  2. [行为识别论文详解]SSN(Temporal Action Detection with Structured Segment Networks)
  3. mysql更新等差数列求和公式_zzuli1006: 求等差数列的和 - 菜鸟头头
  4. 低学历如何在职场中取胜
  5. 全面认识海思SDK及嵌入式层开发-第1/11季视频课程-朱有鹏-专题视频课程
  6. 【元宇宙欧米说】众神时代——游戏与区块链结合,重构游戏产业新面貌
  7. MATALB- robotic Toolbox中机械手运动时末端运动轨迹保留
  8. ai2022中文版(支持m1) v26.0.3中文版
  9. matlab实现水塔水流量问题
  10. CentOS7用yum安装MySQL8.0 2209170054