你得查看后台存在的进程 #jobs
#fg
#bg
两个命令是调入前台和后台的命令
在命令后面加上一个 &
比如:
rm -rf /tmp/ &
Linux 技巧:让进程在后台可靠运行的几种方法
WeiboGoogle+用电子邮件发送本页面
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。
nohup/setsid/&
场景:
如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?
hangup 名称的来由
在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。
解决方法:
我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
1 nohup
nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。让我们先来看一下 nohup 的帮助信息:
NOHUP(1) User Commands NOHUP(1) NAME nohup - run a command immune to hangups, with output to a non-tty SYNOPSIS nohup COMMAND [ARG] nohup OPTION DESCRIPTION Run COMMAND, ignoring hangup signals --help display this help and exit --version output version information and exit可见,nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohupout 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
[root@pvcent107 ~]# nohup ping ~]#2。setsid
nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助信息:
SETSID(8) Linux Programmer’s Manual SETSID(8) NAME setsid - run a program in a new session SYNOPSIS setsid program [ arg ] DESCRIPTION setsid runs a program in a new session可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。
[root@pvcent107 ~]# setsid ping ~]#值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。
3。&
这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。
当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。
[root@pvcent107 ~]# (ping ~]#从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。
man ls
man pages手册页
显示说明
数字说明
Ctrl+Alt+F1/F2F6
Ctrl+Alt+F7,回到图形化界面
who,看看那几个tty连接着
Linux系统有7个运行级别(runlevel):常用的是3和5
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS),没有网络服务
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11表示控制台,进入图形界面
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
运行级别
接通电源BIOS自检,按照BIOS中设置的启动设备(通常是硬盘)来启动, *** 作系统接管硬件以后,
首先读入 /boot 目录下的内核文件。
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。
init 程序首先是需要读取配置文件 /etc/inittab
许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。
也就是说,启动时根据"运行级别",确定要运行哪些程序。
============================================================
Linux系统有7个运行级别(runlevel):
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
在init的配置文件中有这么一行: si::sysinit:/etc/rcd/rcsysinit 它调用执行了/etc/rcd/rcsysinit,
而rcsysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rcsysinit是每一个运行级别都要首先运行的重要脚本
它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务
rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。
init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:
一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh登录
(3)图形界面登录
在linux领域内大多用在服务器上,很少遇到关机的 *** 作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机 。
正确的关机流程为:sync > shutdown > reboot > halt
sync 将数据由内存同步到硬盘中
shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中
Shutdown –h now 立马关机
Shutdown –r now 系统立马重启
reboot 就是重启,等同于 shutdown –r now
halt 关闭系统,等同于shutdown –h now 和 poweroff
最后总结一下,不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。
重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可。
1 重启Linux,见到下图,在3秒钟之内按下回车
2 三秒之内要按一下回车,出现如下界面
3 按下e键就可以进入下图
4 移动到下一行,再次按e键
5 移动到下一行,进行修改
修改完成后回车键,然后按b键进行重新启动进入系统
6 移动到下一行,进行修改
最终修改完密码,reboot一下即可。
Linux Booting Process:
(1) BIOS
功能:执行计算机系统完整性检测;通电自检;搜索/加载/执行 boot loader程序。
一旦 boot loader 程序被探测到,并且加载到内存,BIOS会把控制权交给它。
(2) MBR
MBR位于引导盘(Bootable Disk)的第一个扇区(512B)。
通常是在 /dev/sda 或者 /dev/hda 。
注意:引导盘(bootable disk)和引导分区(bootable partition)的区别。
(3) GRUB
GRUB = Grand Unified Bootloader
如果在系统中安装有多个内核镜像,你可以选择某一个被执行。
GRUB展示了一个启动画面,等待几秒,如果你不输入任何字符,它将会按照grub配置文件的规定加载默认的内核镜像。
Grub配置文件在: /boot/grub/grubconf
它包含了内核和initrdimg
(4) Kernal
(注意Kernal和kernel不一样)
Kernal按照grubconf文件的规定,挂载根文件系统。
一旦kernal启动,它第一件事情就是执行:sbin/init 进程。
initrd是被kernel用做临时根文件系统,直到Kernal挂载了根文件系统。
(5) INIT(Initilization)
根据 /etc/inittab 文件决定Linux运行层级,运行级别决定了哪个初始化程序(Initial Programs)被加载到启动项。
(6) Run Level
根据你的运行级别的设定, *** 作系统会执行下来对应的文件夹下的程序:
Linux的7个运行级别(Run levels):
标准的Linux运行级别为3或者5,如果是3的话,系统就在多用户状态;如果是5的话,则是运行着XWindow系统。不同的运行级别有着不同的用处,也应该根据自己的不同清晰来设置。例如,如果丢失了root口令,那么可以让机器启动进入单用户模式来设置。
如果是使用S(Start)开头的程序,那么是用在启动的时候,
如果是使用K(Kill)开头的程序,那么是用在关机的时候。
我在本教程中将介绍如何在各种Linux桌面环境下,自动启动某个程序。
GNOME桌面环境
在终端中运行这个命令,启动"Startup
Applications
Preferences"(启动应用程序首选项)GUI。
$
gnome-session-properties
点击"Add"(添加)按钮,即可配置一个新的启动应用程序。分别往"Name"(名称)栏和"Command"(命令)栏里面键入该应用程序的名称和该应用程序的CLI命令。往"Comment"(注释)栏里面键入可选的描述。
Unity桌面环境
在Unity
Dash中键入"startup"(启动)。一旦"Startup
Application"(启动应用程序)图标出现,就点击该图标。
一旦"Startup
Applications
Preferences"(启动应用程序首选项)窗口打开,输入"Name"(名称)、"Command"(命令)和"Comment"(注释),即可配置自动启动的某个程序。
KDE桌面环境
首先,打开"System
Settings"(系统设置)窗口。你会在System
Administration(系统管理)下面找到"Startup
and
Shutdown"(启动和关闭)图标。点击该图标。
系统会要求你从一系列已知的应用程序中选择自动启动的某个应用程序。如果你的程序没有列出来,在上面空白区输入该应用程序的名称。如果该程序(比如CLI命令)将在终端中运行,就要选中"Run
in
terminal"(终端中运行)复选框。点击"OK"(确定)按钮。
下一步,系统要求你输入该应用程序的详细信息,包括名称、命令和描述。
之后,你会看到该程序已完成配置,可自动运行。想配置额外的启动程序/脚本,你可以点击右边侧边栏中的"Add
Program"(添加程序)按钮或"Add
Script"(添加脚本)按钮。
MATE桌面环境
在MATE桌面上,依次进入到"Applications"(应用程序)->
"Preferences(首选项)->
"Startup
Applications"(启动应用程序)。
你会看到"Startup
Applications
Preferences"(启动应用程序首选项)窗口。点击"Add"(添加)按钮。
输入启动应用程序的详细信息:"Name"(名称)、"Command"(命令)和"Comment"(注释)。
Xfce桌面环境
从Xfce桌面菜单中选择"Settings
Manager"(设置管理器)。在"Settings"(设置)窗口中,点击"Session
and
Startup"(会话和启动)图标。
在"Application
Autostart"(应用程序自动启动)选项卡下,点击底部的"Add"(添加)按钮。
输入自动启动的某个程序的详细信息:"Name"(名称)、"Command"(命令)和"Description"(描述)。
LXDE桌面环境
想在LXDE桌面环境下配置启动应用程序,只需在终端中运行下面几个命令。
$
mkdir
-p
~/config/lxsession/Lubuntu/
$
touch
~/config/lxsession/Lubuntu/autostart
$
leafpad
autostart
然后,把下面这一项添加到已创建的自动启动文件中:
@conky
这里,"conky"是登录后,我想自动运行的那个CLI命令的名称。
保存并关闭。
准确说,linux
不存在“用命令行登陆”的说法。
准确应该是从本地字符终端登陆。因为在登陆前,是没有命令行的,命令行是一个用户交互 *** 作界面,在你还没有登陆的时候,是不存在“命令行”的。
至于如何切换到本地字符终端,图形状态下用
ctrl
+
alt
+
f1
到
f6
即可,一般
linux
的设计都是
1-6
是字符终端,7
是图形终端,部分发行版
f1
是字符终端,f2-f7
是字符终端。
你切换到这个终端里,就可以看到提示你输入用户名的提示了,输入用户名后回车就是输入密码。密码无回显,正确输入后回车即可,别因为没看到密码哪一行按了键盘没反应就觉得机器坏了。
通常,在我们的电脑上,开机后会执行init程序,也就是systemd,systemd会自动启动你的显示管理器
显示管理器会自动的启动XServer和XClient,server一般就是Xorg。
如果我们没有自启动的登录管理器,就会进到默认的终端登录,你需要在终端上输入 startx 才能显出窗口管理器。startx是xinit的包装,会启动XServer对应的配置文件 /etc/X11/xinit/xserverrc
X这个程序就是Xorg程序。
startx还会启动XClient对应的配置文件 ~/xinitrc
这样,你的桌面就显示出来了,dwm主要会调用xlib的接口,其它桌面则调用更多像Qt、Gtk这样的接口实现
Arch安装文档已经很全面了,在UbuntuServer上安装图形化界面也类似。
vim ~/xinitrc
以上就是关于linux系统下如何从后台启动进程全部的内容,包括:linux系统下如何从后台启动进程、Linux之三Linux的启动过程/关机、Linux( bootloader)启动 *** 作系统过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)