linux 中出现 Read-only file system

    当linux操作系统启动出现root用户也无法进行任何的文件写操作时,无论什么用户(包括root)写文件保存或者删除文件,且对操作文件或目录都有写权限时,还任然报错:E212: Can’t open file for writing 或者 Read-only file system。

1、root用户在home目录下创建test文件,保存时报错如下:


2、root用户删除

[root@hadoop01 home]# ll /etc/.pwd.lock
-rw——-. 1 root root 0 Jun  1  2002 .pwd.lock
[root@hadoop01 home]# rm -rf /etc/.pwd.lock
rm: cannot remove `/etc/.pwd.lock’: Read-only file system
[root@hadoop01 home]# mount -o remount rw /      (这一步是关键的一步,让“/”根文件系统重新挂载并有可读写模式)
[root@hadoop01 home]# rm -rf /etc/.pwd.lock
[root@hadoop01 home]#

造成这个问题的原因大多数是因为非正常关机后导致文件系统受损引起的,在系统重启之后,受损分区就会被Linux自动挂载为只读。解决的方法是通过fsck来修复文件系统,然后重启即可,以下是以针对/dev/xvde1分区,ext4文件系统分区的一个操作案例:

fsck.ext4 -y /dev/xvde1
本文只着重强调一点:要针对出问题的分区进行操作,在挂载了多个硬盘的机器上要仔细分辨一下。

 

报错read-only file system的原因是你所在的分区只有读权限, 没有写权限

mount为挂载分区命令,mount -o remount -w 重新挂载分区并增加写权限,增加读写权限即为 -rw

 

 

问题:

push 某个文件到目标板(比如/data目录下)时,提示其目录是只读的;可通过如下命令,将目标目录临时变更为可读写模式:

解决方法:

mount -o remount -rw  /data

 

【扩展:】

重新挂载为已经挂载了的文件系统(以读写权限挂载),需要注意的是,挂载点必须是一个已经存在的目录,这个目录可以不为空。一般用于此目录下的文件为ro权限,需要临时变更为可修改权限。

参数:

-o <选项> 指定挂载文件系统时的选项,有些也可写到在 /etc/fstab 中。常用的有:
defaults 使用所有选项的默认值(auto、nouser、rw、suid)
auto/noauto 允许/不允许以 –a选项进行安装
dev/nodev 对/不对文件系统上的特殊设备进行解释
exec/noexec 允许/不允许执行二进制代码
suid/nosuid 确认/不确认suid和sgid位
user/nouser 允许/不允许一般用户挂载
codepage=XXX 代码页
iocharset=XXX 字符集
ro 以只读方式挂载
rw 以读写方式挂载
remount 重新安装已经安装了的文件系统

loop 挂载“回旋设备”以及“ISO镜像文件”

 

1、mount:
用于查看哪个模块输入只读,一般显示为:
[root@localhost ~]# mount
/dev/cciss/c0d0p2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/cciss/c0d0p7 on /home type ext3 (rw)
/dev/cciss/c0d0p6 on /var type ext3 (rw)
/dev/cciss/c0d0p3 on /usr type ext3 (rw)
/dev/cciss/c0d0p1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/dm-0 on /home/book/upload/BookFile1 type ext3 (rw)
/dev/dm-1 on /home/book/upload/BookFile2 type ext3 (rw)
/dev/dm-2 on /backup type ext3 (rw)
/dev/dm-3 on /home/book/upload/BookFile3 type ext3 (ro)

2、如果发现有ro,就重新mount,或者umount以后再remount

3、umount /dev/dm-3
如果发现有提示“device is busy”,找到是什么进程使得他busy
fuser -m /mnt/data 将会显示使用这个模块的pid
fuser -mk /mnt/data 将会直接kill那个pid
然后重新mount即可。

4、还有一种方法是直接remount,命令为
mount -o rw,remount /mnt/data。

apache配置多站点

通过把apache配置安装为服务设置多站点

  1. 打开wamp\bin\apache\Apache2.2.21\conf文件夹,复制httpd.conf,重命名为 my.conf
  2. 打开my.conf,修改并保存
    1. Listen 8009 # 端口号 #
    2. ServerName localhost:8009 #服务器名#
    3. DocumentRoot “G:/WapStatic” #设置为网站根目录的url”
    4. <Directory />
    5. Options Indexes FollowSymLinks Includes #支持服务端包含 *.shtml文件支持#
    6. AllowOverride None
    7. Order allow,deny
    8. allow from all
    9. </Directory>
    10. <Directory “G:/WapStatic”> #设置网站根目录的权限#
    11. Options Indexes FollowSymLinks Includes #支持服务端包含 *.shtml文件支持#
    12. AllowOverride all
    13. Order Allow,Deny
    14. Allow from all
    15. </Directory>
  3. 接下来安装站点
    运行 cmd 定位到apache安装目录下的bin文件夹(wamp\bin\apache\Apache2.2.21\bin
    执行 httpd.exe -k install -n “服务名” -f “配置文件的路径”; //安装一个apache服务
    可以用 httpd.exe /?查看各个选项的意思

    1. # 比如:(服务名和配置文件的路径必须用双引号括起来)
    2. httpd.exe -k install -n “longsun” -f “F:\Program Files\Apache Group\Apache2\conf\longsun.conf”
  4. 运行apache目录下的 apacheMonitor.exe 查看当前的apache服务,启动我们刚刚建的服务。
  5. 浏览器打开 http://www.localhost:8009 验证站点是否正常

通过1个IP多端口的方式配置多站点

一个IP + 一个端口 映射一个站点

  1. 打开 conf/httpd.conf 配置文件,修改如下:
    1. Listen 8012 #监听新端口
    2. Include conf/extra/httpd-vhosts.conf # ctrl+f 查找,去掉前面的#注释,包含外部虚拟主机配置文件
    3. #打开虚拟主机配置文件 ( conf/extra/ httpd-vhosts.conf ) , 在底部增加这样一段配置信息
    4. <VirtualHost *:8012>
    5. ServerAdmin webmaster@myweb.com
    6. DocumentRoot “d:/mysite/” #站点根目录
    7. ServerName localhost:8012 #站点主机名 域名+端口 唯一标识一个主机
    8. #由于httpd.conf的全局配置比较严格,默认所有目录不可访问,所以要这个放宽访问权限
    9. <Directory />
    10. Options FollowSymLinks
    11. AllowOverride all
    12. Order deny,allow
    13. Allow from all
    14. </Directory>
    15. </VirtualHost>
  2. 保存配置文件后,重启apache,然后就可以预览 http://localhost:8012/test.html
  3. 在命令行下,转到 apache2/bin目录 运行httpd -S可以分析虚拟主机配置文件是否正确。

通过修改host方式配置多站点

hosts文件位于 window\system32\drivers\etc下

  1. 修改本机的hosts文件,如下:
    1. 127.0.0.1 localhost
    2. 127.0.0.1 www.dede.com
    3. 127.0.0.1 www.phpcms.com
  2. 打开httpd.conf文件,分别去掉下面两行文字前面的#号。
    1. #启用apache的虚拟主机功能。
    2. #LoadModule vhost_alias_module modules/mod_vhost_alias.so
    3. #包含虚拟主机配置。
    4. #Include conf/extra/httpd-vhosts.conf
  3. 打开extra/httpd-vhosts.conf文件,加上自己的虚拟主机配置。
    1. # www.glife.com, www.myphp.com是在hosts文件中指定解析为本机ip的
    2. <VirtualHost *:80>
    3. ServerAdmin stephenjj@126.com
    4. DocumentRoot “d:/pan/shopilex” #注意 目录分隔符用斜杠/
    5. ServerName www.glife.com
    6. </VirtualHost>
    7. <VirtualHost *:80>
    8. ServerAdmin stephenjj@126.com
    9. DocumentRoot “d:/web”
    10. ServerName www.myphp.com
    11. </VirtualHost>
  4. 重启apache, 并访问对应网址试试

1、创建站点文件

站点文件可以是把已经准备好的文件copy 的指定目录,也可以自己一步一步的在本地主机搭建起来。
  • 1

在这里展示一下搭建一个站点文件:

1、cd /var/www/
  // 跳转到指定目录
2、sudo mkdir test
  // 创建test目录
3、 cd test/ 
  //跳转到test目录下
4、sudo vim index.html
  //新建一个index.html 并输入一下代码:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
<html>
<head>
   <meta charset="utf-8">
</head>
<body>
看到本也页面,说明已经搭建多域名成功了!!
</body>
</html> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

保存并退出。index.html 文件会自动生成。

在这里插入图片描述

2、申明一个域名

liunx系统在/ect目录下有个hosts 文件,其作用是是Linux系统上一个负责ip地址与域名快速解析。
那我们现状要做的就是要申明一个域名,通过这个域名来访问本地主机上的一个网站文件。所以,
需要在hosts 添加一条映射。操作如下

在终端上运行如下命令:

sudo vim /etc/hosts
//打开hosts文件
  • 1
  • 2

你会在文件最前面看到类似如下信息:

127.0.0.1       localhost
127.0.1.1       jay-VirtualBox
……
  • 1
  • 2
  • 3

在该文件里,ip 地址和域名都是成对出现的。
127.0.0.1 就是本地主机的ip, localhost 就是相对应的域名。
接下来,我们在最后一条域名解析记录下添加一条域名解析记录:

127.0.0.1   test.com
// 新增一个域名,其指向本地主机(127.0.0.1)
  • 1
  • 2

在这里插入图片描述
保存离开。

3、绑定站点文件

域名有了,那浏览器就可以通过域名访问到指定IP的服务器(这里是本地主机)
但是我们并没有指出接下来浏览器该怎么走。所以我们还需要给出一份更加详情的“地图”给浏览器。

注:
	如果只配置的步骤二就在浏览器进行访问,我们就会看到浏览器会自动访问默认站点文件。当然,
	前提是你已经配置好了一个域名服务器
  • 1
  • 2
  • 3

要绘制这份“地图”,我们需要借助apache(我使用的apache 为apache2。apache2 下载安装 和 具体目录结构请自行百度。)

操作如下:

1、sudo cp /etc/apache2/sites-available/000-default.conf  /etc/apache2/sites-available/test.conf
  ///etc/apache2/sites-available/copy 000-default.conf 配置文件,并在该目录下粘贴、重命名为test.conf。
2. cd /etc/apache2/sites-available/
  // 进入sites-available 目录
3、sudo vim test.conf
  //打开test.conf 文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

修改以下信息:
1、找到 ServerName 去掉 # 的注释,并把后面的域名改为设置的 test.com
2、ServerAdmin 修改为 webmaster@localhost

ServerAdmin 设置一个邮件地址,如果服务器有任何问题将发信到这个地址, 这个地址会在服务器产生的某些页面中出现。

3、DocumentRoot 站点物理路径改为 var/www/test
在这里插入图片描述

注意:如果站点的文件不在 var/www/目录及其子目录下,我们需要在 /etc/apache2/ 目录下的apache2.conf 添加如下代码:

<Directory /home/VMShareFiles/test/>  //这里假定站点物理路径为 /home/VMShareFiles/test/
	Options FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

4、切换激活站点并重启apache2

sudo a2ensite test.conf
sudo /etc/init.d/apache2 restart
  • 1
  • 2

5、浏览器访问 test.com

在这里插入图片描述

通过以上的操作就可以在现有一个域名的情况下在搭建一个新的域名。如果还想再搭建其他域名,重复以上操作即可。

Apache2设置是否显示目录列表

Apache2设置是否显示目录列表

Apache2的配置文件为 /etc/apache2/apache2.conf ,在 <Directory> 部分设置目录访问权限。

一般我们需要隐藏服务器的跟目录,所以我们将配置改为

<Directory />
-	Options Indexes FollowSymLinks
+	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

假如我们需要访问部分服务器下的目录,则新设置一个 <Directory> 节点,并且在将目录设置为服务器的绝对路径,如我们需要访问服务器下的 DownLoadList 目录

<Directory /var/www/html/DownLoadList/>
  Options Indexes
  IndexOptions NameWidth=25 Charset=UTF-8 
  Allow from all
  DirectoryIndex none
</Directory>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中DirectoryIndex none的作用是为了避免自动打开目录下的index.html文件

1 apache安装过程(centos5.1_64)
./configure –prefix=/usr/local/apache2.2.8 LDFLAGS=”-L/usr/lib64 -L/lib64″–enable-mods-shared=all –enable-so –libdir=/usr/lib64 –with-mpm=worker –enable-cache –enable-disk-cache –enable-mem-cache –enable-file-cache –enable-rewrite=share –enable-proxy=share –enable-cgi –enable-proxy-ajp=share –enable-dav=share –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util/
make && make install
2 和tomcat成功整合后,配置apache的默认语言为中文:
vi httpd.conf里 去掉注释#
Include conf/extra/httpd-languages.conf
然后配置conf/extra/httpd-languages.conf文件
添加如下:
DefaultLanguage zh-CN
AddDefaultCharset gb2312
设置虚拟目录:
vi ../httpd.conf
……
Alias /shujb “/home/jack”
<directory “=”” home=”” jack”=””>
Options Indexes FollowSymlinks
       AllowOverride None
Order allow,deny
Allow from all
…….
设置完成后,可以显示目录,但无法正常显示中文,出现乱码。在浏览器切换编码可以正常显示。说明问题处在apache设置的默认语言没有生效。
个性化Apach2目录列表,主要取决于对mod_autoindex模块中的各种指令的使用
和配合。可以去先阅读一下Apache2.0手册中的mod_autoindex模块文档。
个性化配置开始
一、修改httpd.conf文件
对需要个性化的目录进行定制:
 <directory “=”” www=”” download”=””>
Options Indexes FollowSymlinks
IndexOptions FancyIndexing ScanHTMLTitles NameWidth=25
DescriptionWidth=128 VersionSort FoldersFirst
IndexIgnore favicon.ico header.html footer.html images
HeaderName header.html   #header.html路径相对于主目录的
ReadmeName footer.html
AddDescription “ftp安装包” vsftpd.tar.gz
IndexOrderDefault Ascending Name
AllowOverride None
Order allow,deny
Allow from all
[编辑]
部分指令说明:
    * ScanHTMLTitles:如果目录中含有HTML文件,则Apache会自动读取HTML文
件的< title>……部分,用HTML文件的标题作为Description(描述
)显示在列表目录中的 Description部分。。(注意:加载该指令会加大CPU的
负荷!)
    * NameWidth=25 :指定目录列表可以显示最长为25字节的文件/目录名,如
果使用*来做值,会自适应到最长文件名。
    * DescriptionWidth=128:指定目录列表可以显示最长为128字节的文件/目
录描述内容。
    * VersionSort:如果目录中含有同一文件的不同版本,则Apache会对该文
件按照版本号自动排序。
    * FoldersFirst:最先列出文件夹会使显示效果更好看一些吧!
    * IndexIgnore:在它后面设定的文件/目录不会在目录列表中显示。
    * HeaderName:指定该目录列表的header模板,指定一个html文件后,
Apache会用这个网页替换掉默认目录列表上面呆板的Index of …..而显示出个
性化的头网页。(注意:文件路径是相对于列表目录的根而言的,并不是相对于
系统根或者网站根而言的!)
    * ReadmeName:指定该目录列表的footer模板,指定一个html文件后,
Apache会在目录列表的底部加载这个网页。(注意:文件路径是相对于列表目录
的根而言的,并不是相对于系统根或者网站根而言的!)
    * AddDescription:如果你想为某个文件设置一个Description(描述)的
话,就使用这个指令,格式是AddDescription “描述” 文件名 。
    * IndexOrderDefault Ascending Name:指定目录列表的排序方式为按名称
排序。
当然,还可以定制很多其他的内容,包括可以为每一个文件设定一个图标等等,
去读文档吧。
[编辑]
二、建立header.html和footer.html
这两个文件是列表目录的头网页和尾网页,也是个性化的关键。其实这部分和
Apache水平已经没有什么关系了,主要还是看你制作网页水平如何了,呵呵。
这里给出两个文件的格式:
    * header.html:
可以在这里加入个性化内容,图片、FLASH、表格等等,随意啦!

* footer.html:

可以在这里加入个性化内容,图片、FLASH、表格等等,随意啦!

注:
options -indexes
(此时直接访问目录403 Forbidden)
显示:
options +indexes

Apache默认显示文件列表.
可以进一步控制文件列表显示模式:
这里有许多配置

HeaderName HEADER.html
在返回的文件列表信息顶部插入的Html文件.可以使用绝对或相对路径.不过仍然
建议使用绝对路径,因为相对路径无法被子目录继承..
指定的文件在Apache里设定的MIME类型必须为 text/*
默认的文件是header.html
ReadmeName /avc.htm
附加在文件列表尾部的HTML文件.用法同 HeaderName Filename的语法
默认的文件是当前目录下 footer.html
IndexOptions Charset=GB2312 这是目录的默认语言。
IndexIgnore *.jpg *.ico .htaccess php.ini
在返回文件列表中屏蔽特定文件.如果设置为 IndexIgnore * ,那么实际上返回
一个空文件
IndexOrderDefault Ascending|Descending Name|Date|Size|Description
文件列表排序方式
AddDescription “Qmail安装包” qmail.tar.gz
设置目录列表中文件、文件夹的描述
Note:
通常的header.html 和 footer.html格式:
header.html
…..

footer.html

……

即把文件列表嵌套.在 表格里

最后我的设置为:
Alias /shujb “/home/jack”
<directory “=”” home=”” jack”=””>
Options Indexes FollowSymlinks
IndexOptions FancyIndexing ScanHTMLTitles HTMLTable NameWidth=125 DescriptionWidth=256 VersionSort FoldersFirst
IndexIgnore favicon.ico header.html footer.html images
HeaderName /conf/extra/header.html
ReadmeName /conf/extra/footer.html
IndexOptions Charset=GB2312
IndexOrderDefault Descending Name
AllowOverride None
Order allow,deny
Allow from all
header.html放在主目录ROOT/conf/extra/header.html下。
header.html,footer.html也就没有设置什么。至此目录可以正常显示了。。相对于apache默认的好多了。呵呵。

实例:

导读:apache2服务器中禁止目录列表的设置方法,修改Options项,去掉Indexes,或改成-Indexes,禁止显示目录列表。

Apache2禁止显示目录列表的设置方法

一、默认情况,如果apache指定的目录没有配置“index.php index.html index.htm”文件之一,则appache会显示目录及目录下的所有文件:

复制代码代码示例:
<IfModule dir_module>
DirectoryIndex index.php index.html index.htm
</IfModule>

二、在apache2中,所有配置都可以写到/etc/apache2/httpd.conf(默认里面是空的), 但在站点配置文件/etc/apache2/sites-available/* (例如default)文件中。

可以单独针对某个单独的域名来配置规则,在其中找到目录配置:

复制代码代码示例:
 <Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

修改Options项,去掉“Indexes”,或改成“-Indexes”即可(索引)。

修改完配置,重新载入apache2配置或重启apache2:

复制代码代码示例:
#sudo servcie apache2 reload 或
#sudo /etc/init.d/apache2 restart

重启

service apache2 restart重启Apache服务才会生效

Linux文件编辑命令vi详细整理

linux vi 命令编辑操作

(总结)

一、vi编辑器有3种基本工作模式

首先需要知道vi编辑器有3种基本工作模式,分别是:命令模式、文本输入模式、和末行模式。

第一:命令行模式:该模式是进入vi编辑器后的默认模式。任何时候,不管用户处于何种模式,按下ESC键即可进入命令模式。在该模式下,用户可以输入vi命令,用户管理自己的文档。此时从键盘上输入的任何字符都被当作编辑命令来解释。若输入的字符是合法的vi命令,则vi在接受用户命令之后完成相应的动作。但需要注意的是,所输入的命令并不回显在屏幕上。若输入的字符不是vi命令,vi会响铃报警。

第二:文本输入模式:在命令模式下输入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被vi当作文件内容保护起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按ESC键即可。

第三:末行模式:末行模式也称ex转义模式。在命令模式下,用户按“:”键即可进入末行模式下,此时vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的说明符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令在执行完后,vi自动回到命令模式。如果要从命令模式转换到编辑模式,可以键入a或者i。如果需要从文本模式返回,则按ESC即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。

综上,一般我们使用命令打开文件的时候,是进入到命令模式。在命令模式下,可以切换到文本输入模式和末行模式,但是文本输入模式和末行模式之间是不可以直接相互切换了,因此文本输入模式切换到末行模式,需要先回到命令模式再切换,反之亦然。

此外,编辑文本可以在文本输入模式下,键盘输入对文编进行编辑,或者在命令模式下使用vi命令也是可以起到编辑效果的。

实例演示

首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式

接下来我们按i,然后键盘随便输入写内容。

然后按ESC重新进入到命令模式。

在命令模式的情况下,我们按:,进入到了末行模式。

我们输入wq!,然后回车,强行保存退出。

下次我们再打开对应文件(可用less filename命令打开),即可看到内容已经更改。

补充:

(1)末行模式下:q! 【强制退出不保存】 q【退出不保存】 wq【退出并保存后面也可以加个!】

(2)如果你不想保存直接退出有可以在命令模式下使用“ctrl+z”快捷键或者按住“shift”键,输入两个z即可退出。

更多命令

进入vi的命令

vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename….filename :打开多个文件,依次进行编辑

屏幕翻滚类命令

Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令

i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行

删除命令

ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本

搜索及替换命令

/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换

一、查找
/pattern<Enter> :向下查找pattern匹配字符串
?pattern<Enter>:向上查找pattern匹配字符串

使用了查找命令之后,使用如下两个键快速查找:
n:按照同一方向继续查找
N:按照反方向查找

字符串匹配

pattern是需要匹配的字符串,例如:

1
1:  /abc<Enter>      #查找abc

除此之外,pattern还可以使用一些特殊字符,包括(/、^、$、*、.),其中前三个这两个是vi与vim通用的,“/”为转义字符。

1
2
3
1:  /^abc<Enter>    #查找以abc开始的行
2:  /abc$<Enter> #查找以abc结束的行
3:  //^abc<Enter> #查找^abc字符串

二、替换

基本替换

1
2
3
4
5
6
1:  :s/vivian/sky/         #替换当前行第一个 vivian 为 sky
2:  :s/vivian/sky/g     #替换当前行所有 vivian 为 sky
3:  :n,$s/vivian/sky/     #替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
4:  :n,$s/vivian/sky/g     #替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
  (n 为数字,若 n 为 .,表示从当前行开始到最后一行)
5:  :%s/vivian/sky/        #(等同于:1,$s/vivian/sky/   :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
1
<em>6</em>: :%s/vivian/sky/g #(等同于:1,$s/vivian/sky/g     :g/vivian/s//sky/g)替换每一行的所有 vivian 为 sky

可以使用 #或+ 作为分隔符,此时中间出现的 / 不会作为分隔符

1
2
1:  :s#vivian/#sky/#         替换当前行第一个 vivian/ 为 sky/
2:  :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

例如:

1
2
3
4
5
1:  :s/str1/str2/          #用字符串 str2 替换行中首次出现的字符串 str1
2:  :s/str1/str2/g         #用字符串 str2 替换行中所有出现的字符串 str1
3:  :.,$ s/str1/str2/g     #用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
4:  :1,$ s/str1/str2/g     #用字符串 str2 替换正文中所有出现的字符串 str1
5:  :g/str1/s//str2/g      #功能同上

选项设置

all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息

末行模式命令

:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行

寄存器操作

“?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
“?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
“?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
“?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

实例:vi 命令基本操作:

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 令。由于 对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编 辑器,学会它后,您将在Linux的世界里畅行无阻。

1、vi的基本概念
  基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
    1) 命令行模式command mode)
  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
    2) 插入模式(Insert mode)
  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
    3) 底行模式(last line mode)
  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
    不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2、vi的基本操作
a) 进入vi
    在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
   $ vi myfile
不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 「插入模式(Insert mode)」再说吧!
b) 切换至插入模式(Insert mode)编辑文件
  在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
c) Insert 的切换
  您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。
d) 退出vi及保存文件
  在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)
3、命令行模式(command mode)功能键
1). 插入模式
       按「i」切换进入插入模式「insert mode」,按”i”进入插入模式后是从光标当前位置开始输入文件;
  按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
2). 从插入模式切换为命令行模式
      按「ESC」键。
3). 移动光标
  vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
  按「ctrl」+「b」:屏幕往”后”移动一页。
  按「ctrl」+「f」:屏幕往”前”移动一页。
  按「ctrl」+「u」:屏幕往”后”移动半页。
  按「ctrl」+「d」:屏幕往”前”移动半页。
  按数字「0」:移到文章的开头。
  按「G」:移动到文章的最后。
  按「$」:移动到光标所在行的”行尾”。
  按「^」:移动到光标所在行的”行首”
  按「w」:光标跳到下个字的开头
  按「e」:光标跳到下个字的字尾
  按「b」:光标回到上个字的开头
  按「#l」:光标移到该行的第#个位置,如:5l,56l。
4). 删除文字
  「x」:每按一次,删除光标所在位置的”后面”一个字符。
  「#x」:例如,「6x」表示删除光标所在位置的”后面”6个字符。
  「X」:大写的X,每按一次,删除光标所在位置的”前面”一个字符。
  「#X」:例如,「20X」表示删除光标所在位置的”前面”20个字符。
  「dd」:删除光标所在行。
  「#dd」:从光标所在行开始删除#行
5). 复制
  「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
  「#yw」:复制#个字到缓冲区
  「yy」:复制光标所在行到缓冲区。
  「#yy」:例如,「6yy」表示拷贝从光标所在的该行”往下数”6行文字。
  「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与”y”有关的复制命令都必须与”p”配合才能完成复制与粘贴功能。
6). 替换
  「r」:替换光标所在处的字符。
  「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
7). 回复上一次操作
  「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次”u”可以执行多次回复。
8). 更改
  「cw」:更改光标所在处的字到字尾处
  「c#w」:例如,「c3w」表示更改3个字
9). 跳至指定的行
  「ctrl」+「g」列出光标所在行的行号。
  「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

4、Last line mode下命令简介
在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

A) 列出行号

「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

B) 跳到文件中的某一行

「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

C) 查找字符

「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。

「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

D) 保存文件

「w」:在冒号输入字母「w」就可以将文件保存起来。

E) 离开vi

「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。

「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

5、vi命令列表
1、下表列出命令模式下的一些键的功能:

h
左移光标一个字符

l
右移光标一个字符

k
光标上移一行

j
光标下移一行

^
光标移动至行首

0
数字”0″,光标移至文章的开头

G
光标移至文章的最后

$
光标移动至行尾

Ctrl+f
向前翻屏

Ctrl+b
向后翻屏

Ctrl+d
向前翻半屏

Ctrl+u
向后翻半屏

i
在光标位置前插入字符

a
在光标所在位置的后一个字符开始增加

o
插入新的一行,从行首开始输入

ESC
从输入状态退至命令状态

x
删除光标后面的字符

#x
删除光标后的#个字符

X
(大写X),删除光标前面的字符

#X
删除光标前面的#个字符

dd
删除光标所在的行

#dd
删除从光标所在行数的#行

yw
复制光标所在位置的一个字

#yw
复制光标所在位置的#个字

yy
复制光标所在位置的一行

#yy
复制从光标所在行数的#行

p
粘贴

u
取消操作

cw
更改光标所在位置的一个字

#cw
更改光标所在位置的#个字

2、下表列出行命令模式下的一些指令
w filename
储存正在编辑的文件为filename

wq filename
储存正在编辑的文件为filename,并退出vi

q!
放弃所有修改,退出vi

set nu
显示行号

/或?
查找,在/后输入要查找的内容

n
与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

对于第一次用vi,有几点注意要提醒一下:
1、 用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。
3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

Linux 在线模拟器

最近在学习Linux的一些命令的使用,但是很久之前装的Linux虚拟机被删掉了,又不想为了练习几个命令折腾一遍虚拟机。所以,就尝试地搜了一下,看看有没有在线的Linux模拟器可以使用,只要可以练习一下命令的使用即可。在google中用英文关键词一搜,还真有大牛弄出了一些在线的Linux模拟器,而且用起来还不错。搜集了4个,赶紧分享出来,供大家初步学习和实践Linux之用。

一个叫Fabrice Bellard的工程师使用 JavaScript 在浏览器上模拟出了一个 Linux 系统。没有图形化界面,完全使用命令行的方式与之互动。Linux操作系统内核版本为2.6.20。具体使用过程中可以参考jslinux:的FAQ:http://bellard.org/jslinux/faq.html 和技术说明:http://bellard.org/jslinux/tech.html

jslinux:控制台窗口:

image

维也纳一家叫mass:werk media environments的公司使用JavaScript 开发的免费的类UNIX的在线OS。JS/UIX 的使用参考手册地址:http://www.masswerk.at/jsuix/man.txt  同时,开发和使用的JavaScript函数库termlib.js也是免费使用的,可以到公司官网上去下载:http://www.masswerk.at/termlib/

官网上对JS/UIX 的介绍:”JS/UIX is an UN*X-like OS for standard web-browsers, written entirely in JavaScript (no plug-ins used). It comprises a virtual machine, shell, virtual file-system, process-management, and brings its own terminal with screen- and keyboard-mapping.”

JS/UIX 控制台窗口:

image

jor1k是由新西兰的一位叫Benjamin Burns的软件工程师开发的,Benjamin Burns目前就职于位置服务公司Telogis,jor1k是他在github上的开源项目,也是用JavaScript开发的:https://github.com/s-macke/jor1k/

github上关于jor1k的介绍:“jor1k is a OpenRISC 1000 emulator written in JavaScript running Linux. It runs in almost any modern web browser.”

jor1k控制台窗口:

image

cb.vu也是一个用Javascript开发的在线模拟器,系统版本是FreeBSD 7.1-STABLE ,界面是铺满浏览器窗口的,个人感觉使用起来比前面几个都方便一点,一般用这个。

使用过程中可参考TOOLBOX中文版:http://cb.vu/unixtoolbox_zh_CN.xhtml

cb.vu控制台窗口:

image

linux 中更改用户权限和用户组的命令

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

文件或目录的访问权 限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文 件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  1. $ ls -l sobsrc. tgz
  2. rw-r–r– 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。例如:

– rw- r– r–

普通文件 文件主 组用户 其他用户

是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。

下面分别对这些命令加以介绍。

chmod 命令

chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

以主文件夹下的一个名为“cc”的文件夹为例。下面一步一步介绍如何修改权限:

1.打开终端。输入”su”(没有引号)

2.接下来会要你输入密码,输入你的root密码。

3.假设我的文件夹在主目录里,地址为  /var/home/dengchao/cc  。假设我要修改文件权限为777,则在终端输入  chmod  777 /var/home/userid/cc 文件夹的权限就变为了777。

如果是修改文件夹及子文件夹权限可以用  chmod -R 777 /var/home/userid/cc

具体的权限(例如777的含意等)在下面解释下:

1.777有3位,最高位7是设置文件所有者访问权限,第二位是设置群组访问权限,最低位是设置其他人访问权限。

其中每一位的权限用数字来表示。具体有这些权限:

  • r(Read,读取,权限值为4):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目 录的权限。
  • w(Write,写入,权限值为2):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
  • x(eXecute,执行,权限值为1):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

2. 首先我们来看如何确定单独一位上的权限数值,例如最高位表示文件所有者权限数值,当数字为7时,7用“rwx”表示 –{4(r)+2(w)+1(x)=7}–又如果数值为6,则用“rw-”表示–{4(r)+2(w)+0(x)=6}–,”-”表示不具备权限,这里表 示不具备“执行”权限。

假如我们设定其他用户的访问权限为 “r–”,则数值为4+0+0=4

一开始许多初学者会被搞糊涂,其实很简单,我们将rwx看成二进制数,如果有则用1表示,没有则有0表示,那么rwx则可以表示成为:111

而二进制的111就是7。

3.我们再来看下怎么确定3个数位上的权限。假如我们要给一个文件设置权限,具体权限如下:

文件所有者有“读”、“写”、“执行”权限,群组用户有“读”权限,其他用户有“读”权限,则对应的字母表示为”rwx r– r–“,对应的数字为744

一般都是最高位表示文件所有者权限值,第二位表示群组用户权限,最低位表示其他用户权限。

下面来举些例子熟悉下。

权限 数值
rwx rw- r– 764
rw- r– r– 644
rw- rw- r– 664

该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

1. 文字设定法

chmod [who] [+ | – | =] [mode] 文件名¼

命令中各选项的含义为:

操作对象who可是下述字母中的任一个或者它们的组合:

  • u 表示“用户(user)”,即文件或目录的所有者。
  • g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
  • o 表示“其他(others)用户”。
  • a 表示“所有(all)用户”。它是系统默认值。

操作符号可以是:

  • + 添加某个权限。
  • – 取消某个权限。
  • = 赋予给定权限并取消其他所有权限(如果有的话)。
  • 设置mode所表示的权限可用下述字母的任意组合:
  • r 可读。
  • w 可写。
  • x 可执行。
  • X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
  • s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
  • t 保存程序的文本到交换设备上。
  • u 与文件属主拥有一样的权限。
  • g 与和文件属主同组的用户拥有一样的权限。
  • o 与其他用户拥有一样的权限。
  • -c : 若该档案权限确实已经更改,才显示其更改动作
  • -f : 若该档案权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

文件名:以空格分开的要改变权限的文件列表,支持通配符。在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example使同组和其他用户对文件example 有读权限。

例1:

  1. $ chmod a+x sort

即设定文件sort的属性为:

文件属主(u) 增加执行权限

与文件属主同组用户(g) 增加执行权限

其他用户(o) 增加执行权限

例2:

  1. $ chmod ug+w,o-x text

即设定文件text的属性为:

文件属主(u) 增加写权限

与文件属主同组用户(g) 增加写权限

其他用户(o) 删除执行权限

例3:

  1. $ chmod u+s a.out

假设执行chmod后a.out的权限为(可以用ls – l a.out命令来看):

  1. rws–x–x 1 inin users 7192 Nov 4 14:22 a.out

并且这个执行文件要用到一个文本文件shiyan1.c,其文件存取权限为“–rw——-”,即该文件只有其属主具有读写权限。

当其他用户执行a.out这个程序时,他的身份因这个程序暂时变成inin(由于chmod命令中使用了s选项),所以他就能够读取shiyan1.c这个文件(虽然这个文件被设定为其他人不具备任何权限),这就是s的功能。

因此,在整个系统中特别是root本身,最好不要过多的设置这种类型的文件(除非必要)这样可以保障系统的安全,避免因为某些程序的bug而使系统遭到入侵。

例4:

  1. $ chmod a–x mm.txt
  2. $ chmod –x mm.txt
  3. $ chmod ugo–x mm.txt

以上这三个命令都是将文件mm.txt的执行权限删除,它设定的对象为所有使用者。

2. 数字设定法

我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。

数字设定法的一般形式为:chmod [mode] 文件名¼

例1:

  1. $ chmod 644 mm.txt
  2. $ ls –l

即设定文件mm.txt的属性为:

  1. rw-r–r– 1 inin users 1155 Nov 5 11:22 mm.txt

文件属主(u)inin 拥有读、写权限

与文件属主同组人用户(g) 拥有读权限

其他人(o) 拥有读权限

例2:

  1. $ chmod 750 wch.txt
  2. $ ls –l
  3. rwxr-x— 1 inin users 44137 Nov 12 9:22 wchtxt

即设定wchtxt这个文件的属性为:

文件主本人(u)inin 可读/可写/可执行权

与文件主同组人(g) 可读/可执行权

其他人(o) 没有任何权限

chgrp命令

功能:改变文件或目录所属的组。

语法:chgrp [选项] group filename¼

参数:

  • -c或–changes 效果类似”-v”参数,但仅回报更改的部分。
  • -f或–quiet或–silent  不显示错误信息。
  • -h或–no-dereference  只对符号连接的文件作修改,而不更动其他任何相关文件。
  • -R或–recursive  递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v或–verbose  显示指令执行过程。
  • –help  在线帮助。
  • –reference=&lt;参考文件或目录&gt;  把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
  • –version  显示版本信息。

该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。

该命令的各选项含义为:

– R 递归式地改变指定目录及其下的所有子目录和文件的属组。

例1:

  1. chgrp – R book /opt/local /book

改变/opt/local /book/及其子目录下的所有文件的属组为book。

chown 命令

功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户yusi,为了让用户yusi能够存取这个文件,root用户应该把这个文件的属主设为yusi,否则,用户yusi无法存取这个文件。

语法:chown [选项] 用户或组 文件

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

参数说明:

  • user : 新的档案拥有者的使用者 ID
  • group : 新的档案拥有者的使用者群体(group)
  • -c : 若该档案拥有者确实已经更改,才显示其更改动作
  • -f : 若该档案拥有者无法被更改也不要显示错误讯息
  • -h : 只对于连结(link)进行变更,而非该 link 真正指向的档案
  • -v : 显示拥有者变更的详细资料
  • -R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

例1:把文件yusi123.com的所有者改为yusi。

  1. chown yusi yusi123.com

例2:把目录/demo及其下的所有文件和子目录的属主改成yusi,属组改成users。

  1. $ chown – R yusi.users /demo

例如:chown qq /home/qq  (把home目录下的qq目录的拥有者改为qq用户)

例如:chown -R qq /home/qq  (把home目录下的qq目录下的所有子文件的拥有者改为qq用户)

 

用户组 chgrp -R foldname zdz

chown -R  所有者用户名.组名 文件夹名称
例如:chown -R  zdz.nginx KooBox
root@ali-qss:/var/www# chown -R www-data.www-data html

命令详解直接搜索就很多了,这里不多说了。

================================

chmod命令使用数字修改文件权限

Linux 系统中,文件的基本权限由 9 个字符组成,以 rwxrw-r-x 为例,我们可以使用数字来代表各个权限,各个权限与数字的对应关系如下:

r –> 4
w –> 2
x –> 1

由于这 9 个字符分属 3 类用户,因此每种用户身份包含 3 个权限(r、w、x),通过将 3 个权限对应的数字累加,最终得到的值即可作为每种用户所具有的权限。

拿 rwxrw-r-x 来说,所有者、所属组和其他人分别对应的权限值为:

所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5

所以,此权限对应的权限值就是 765。

使用数字修改文件权限的 chmod 命令基本格式为:

[root@localhost ~]# chmod [-R] 权限值 文件名

-R(注意是大写)选项表示连同子目录中的所有文件,也都修改设定的权限。

例如,使用如下命令,即可完成对 .bashrc 目录文件的权限修改:

[root@localhost ~]# ls -al .bashrc
-rw-r–r–. 1 root root 176 Sep 22 2004 .bashrc
[root@localhost ~]# chmod 777 .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Sep 22 2004 .bashrc

再举个例子,通常我们以 Vim 编辑 Shell 文件批处理文件后,文件权限通常是 rw-rw-r–(644),那么,如果要将该文件变成可执行文件,并且不让其他人修改此文件,则只需将此文件的权限该为 rwxr-xr-x(755)即可。

chmod命令使用字母修改文件权限

既然文件的基本权限就是 3 种用户身份(所有者、所属组和其他人)搭配 3 种权限(rwx),chmod 命令中用 u、g、o 分别代表 3 种身份,还用 a 表示全部的身份(all 的缩写)。另外,chmod 命令仍使用 r、w、x 分别表示读、写、执行权限。

使用字母修改文件权限的 chmod 命令,其基本格式如图 1 所示。

chmod 命令基本格式
图 1 chmod 命令基本格式

例如,如果我们要设定 .bashrc 文件的权限为 rwxr-xr-x,则可执行如下命令:

[root@localhost ~]# chmod u=rwx,go=rx .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Sep 22 2004 .bashrc

再举个例子,如果想要增加 .bashrc 文件的每种用户都可做写操作的权限,可以使用如下命令:

[root@localhost ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Sep 22 2004 .bashrc
[root@localhost ~]# chmod a+w .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Sep 22 2004 .bashrc

增加权限给当前用户 chmod +wx filename

chmod -R 777 /upload

语法:chmod [who] [+ | – | =] [mode] 文件名

命令中各选项的含义为

u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
– 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。

实例

修改文件可读写属性的方法
例如:把index.html 文件修改为可写可读可执行:
chmod 777 index.html

要修改目录下所有文件属性可写可读可执行:
chmod 777 *.*

把文件夹名称与后缀名用*来代替就可以了。
比如:修改所有htm文件的属性:
chmod 777 *.htm

修改文件夹属性的方法
把目录 /images/small 修改为可写可读可执行
chmod 777 /images/small

修改目录下所有的文件夹属性
chmod 777 *

把文件夹名称用*来代替就可以了

要修改文件夹内所有的文件和文件夹及子文件夹属性为可写可读可执行

chmod -R 777 /upload

总结linux下目录和文件的权限区别

文件:读文件内容(r)、写数据到文件(w)、作为命令执行文件(x)。
目录:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)
具体说就是:
(1)有只读权限的用户不能用cd进入该目录:还必须有执行权限才能进入。
(2)有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
(3)必须有读和执行权限才可以ls列出目录清单,或使用cd命令进入目录。
(4)有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。

查看目录权限

查看文件权限的语句:
在终端输入:
ls -l xxx.xxx (xxx.xxx是文件名)
那么就会出现相类似的信息,主要都是这些:
-rw-rw-r–
一共有10位数
其中: 最前面那个 – 代表的是类型
中间那三个 rw- 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r– 代表的是其他人(other)
然后我再解释一下后面那9位数:
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
– 表示相应的权限还没有被授予
现在该说说修改文件权限了
在终端输入:
chmod o w xxx.xxx
表示给其他人授予写xxx.xxx这个文件的权限
chmod go-rw xxx.xxx
表示删除xxx.xxx中组群和其他人的读和写的权限
其中:
u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
其中:rwx也可以用数字来代替
r ————4
w ———–2
x ————1
– ————0
行动:
表示添加权限
– 表示删除权限
= 表示使之成为唯一的权限
当大家都明白了上面的东西之后,那么我们常见的以下的一些权限就很容易都明白了:
-rw——- (600) 只有所有者才有读和写的权限
-rw-r–r– (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx—— (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx–x–x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限

chgrp 命令用于修改文件(或目录)的所属组。

为了方便初学者记忆,可以将 chgrp 理解为是 “change group” 的缩写。

chgrp 命令的用法很简单,其基本格式为:

[root@localhost ~]# chgrp [-R] 所属组 文件名(目录名)

-R(注意是大写)选项长作用于更改目录的所属组,表示更改连同子目录中所有文件的所属组信息。

使用此命令需要注意的一点是,要被改变的群组名必须是真实存在的,否则命令无法正确执行,会提示 “invaild group name”。

举个例子,当以 root 身份登录 Linux 系统时,主目录中会存在一个名为 install.log 的文件,我们可以使用如下方法修改此文件的所属组:

[root@localhost ~]# groupadd group1
#新建用于测试的群组 group1
[root@localhost ~]# chgrp group1 install.log
#修改install.log文件的所属组为group1
[root@localhost ~]# ll install.log
-rw-r–r–. 1 root group1 78495 Nov 17 05:54 install.log
#修改生效
[root@localhost ~]# chgrp testgroup install.log
chgrp: invaild group name ‘testgroup’

可以看到,在具有 group1 群组的前提下,我们成功修改了 install.log 文件的所属组,但我们再次试图将所属组修改为 testgroup 时,命令执行失败,就是因为系统的 /etc/group 文件中,没有 testgroup 群组。

(Service iptables stop/start)关闭/打开防火墙 Failed to stop iptables.service: Unit iptables.service not loaded.

背景: 

测试部署NetCore 项目到linux 系统时,窗口显示项目部署成功;但是本机无法访问(linux 在虚拟机上[ centos 7.6] );  如下图↓

 

 

能够相互ping  通,(Xshell 连接正常。),在centos 上 也能正常访问,后来记起在进行linux   安装成功后,没有关闭防火墙,初步猜测是由于没有关闭防火墙导致,那关闭防火墙不就可以了?

二、操作

1、打开linux 终端,输入:  service  iptables stop   ,就提示 标题展示的异常;

 

 

2、然后输入:systemctl stop firewalld   (暂时关闭防火墙)

查看防火墙状态:systemctl status firewalld

 

 

 

成功了!!!!

三、回顾总结

经过查找发现:在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理 ; 如果想要使用 service iptables start/stop 命令,需要下载     iptables-services

1、在 Centos 7 下下载 iptables-services 时,需要执行以下命令

systemctl stop firewalld     –关闭防火墙

      systemctl mask firewalld

yum install iptables-services   –安装iptables-services

       systemctl enable iptables    –设置开机启动

service iptables save       –保存

2、操作linux 防火墙命令:

复制代码
1:查看防火状态
    systemctl status firewalld
    service  iptables status

2:暂时关闭防火墙
    systemctl stop firewalld
    service  iptables stop

3:永久关闭防火墙
    systemctl disable firewalld
    chkconfig iptables off

4:重启防火墙
    systemctl enable firewalld
    service iptables restart  

5:永久关闭后重启(未测试)
    chkconfig iptables on
复制代码

 

查找资料:1、https://www.cnblogs.com/jxldjsn/p/10794171.html

2、https://blog.csdn.net/c233728461/article/details/52679558/

查看Linux服务器中所有正在运行的进程服务

 Linux 中所有正在运行的服务。大多数管理员会在 System V(SysV)初始化系统中使用 service service-name status 或 /etc/init.d/service-name status,而在 systemd 初始化系统中使用 systemctl status service-name。

查看服务进程:ps aux

查看服务cpu利用:top

查看服务对应端口:netstat -nlp

以上命令可以清楚地显示该服务是否在服务器上运行,这也是每个 Linux 管理员都该知道的非常简单和基础的命令。

如果你对系统环境并不熟悉,也不清楚系统在运行哪些服务,你会如何检查?

是的,我们的确有必要这样检查一下。这将有助于我们了解系统上运行了什么服务,以及哪些是必要的、哪些需要被禁用。

init(初始化initialization的简称)是在系统启动期间运行的第一个进程。init 是一个守护进程,它将持续运行直至关机。

大多数 Linux 发行版都使用如下的初始化系统之一:

System V 是更老的初始化系统

Upstart 是一个基于事件的传统的初始化系统的替代品

systemd 是新的初始化系统,它已经被大多数最新的 Linux 发行版所采用

什么是 System V(SysV)

SysV(意即 System V) 初始化系统是早期传统的初始化系统和系统管理器。由于 sysVinit 系统上一些长期悬而未决的问题,大多数最新的发行版都适用于 systemd 系统。

什么是 Upstart 初始化系统

Upstart 是一个基于事件的 /sbin/init 的替代品,它控制在启动时的任务和服务的开始,在关机时停止它们,并在系统运行时监控它们。

它最初是为 Ubuntu 发行版开发的,但其是以适合所有 Linux 发行版的开发为目标的,以替换过时的 System-V 初始化系统。

什么是 systemd

systemd 是一个新的初始化系统以及系统管理器,它已成为大多数 Linux 发行版中非常流行且广泛适应的新的标准初始化系统。systemctl 是一个 systemd 管理工具,它可以帮助我们管理 systemd 系统。

方法一:如何在 System V(SysV)系统中查看运行的服务

以下命令可以帮助我们列出 System V(SysV) 系统中所有正在运行的服务。

如果服务很多,我建议使用文件查看命令,如 less、more 等,以便得到清晰的结果。

service –status-all

service –status-all | more

service –status-all | less

abrt-ccpp hook is installed

abrtd (pid 2131) is running…

abrt-dump-oops is stopped

acpid (pid 1958) is running…

atd (pid 2164) is running…

auditd (pid 1731) is running…

Frequency scaling enabled using ondemand governor

crond (pid 2153) is running…

hald (pid 1967) is running…

htcacheclean is stopped

httpd is stopped

Table: filter

Chain INPUT (policy ACCEPT)

num target prot opt source destination

1 ACCEPT all ::/0 ::/0 state RELATED,ESTABLISHED

2 ACCEPT icmpv6 ::/0 ::/0

3 ACCEPT all ::/0 ::/0

4 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:80

5 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:21

6 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:22

7 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:25

8 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2082

9 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2086

10 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2083

11 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2087

12 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:10000

13 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited

Chain FORWARD (policy ACCEPT)

num target prot opt source destination

1 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited

Chain OUTPUT (policy ACCEPT)

num target prot opt source destination

iptables: Firewall is not running.

irqbalance (pid 1826) is running…

Kdump is operational

lvmetad is stopped

mdmonitor is stopped

messagebus (pid 1929) is running…

SUCCESS! MySQL running (24376)

rndc: neither /etc/rndc.conf nor /etc/rndc.key was found

named is stopped

netconsole module not loaded

Usage: startup.sh { start | stop }

Configured devices:

lo eth0 eth1

Currently active devices:

lo eth0

ntpd is stopped

portreserve (pid 1749) is running…

master (pid 2107) is running…

Process accounting is disabled.

quota_nld is stopped

rdisc is stopped

rngd is stopped

rpcbind (pid 1840) is running…

rsyslogd (pid 1756) is running…

sandbox is stopped

saslauthd is stopped

smartd is stopped

openssh-daemon (pid 9859) is running…

svnserve is stopped

vsftpd (pid 4008) is running…

xinetd (pid 2031) is running…

zabbix_agentd (pid 2150 2149 2148 2147 2146 2140) is running…

执行以下命令,可以只查看正在运行的服务:

service –status-all | grep running

crond (pid 535) is running…

httpd (pid 627) is running…

mysqld (pid 911) is running…

rndc: neither /etc/rndc.conf nor /etc/rndc.key was found

rsyslogd (pid 449) is running…

saslauthd (pid 492) is running…

sendmail (pid 509) is running…

sm-client (pid 519) is running…

openssh-daemon (pid 478) is running…

xinetd (pid 485) is running…

运行以下命令以查看指定服务的状态:

service –status-all | grep httpd

httpd (pid 627) is running…

或者,使用以下命令也可以查看指定服务的状态:

service httpd status

httpd (pid 627) is running…

使用以下命令查看系统启动时哪些服务会被启用:

chkconfig –list

crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

htcacheclean 0:off 1:off 2:off 3:off 4:off 5:off 6:off

httpd 0:off 1:off 2:off 3:on 4:off 5:off 6:off

ip6tables 0:off 1:off 2:on 3:off 4:on 5:on 6:off

iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off

modules_dep 0:off 1:off 2:on 3:on 4:on 5:on 6:off

mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off

named 0:off 1:off 2:off 3:off 4:off 5:off 6:off

netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off

netfs 0:off 1:off 2:off 3:off 4:on 5:on 6:off

network 0:off 1:off 2:on 3:on 4:on 5:on 6:off

nmb 0:off 1:off 2:off 3:off 4:off 5:off 6:off

nscd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

portreserve 0:off 1:off 2:on 3:off 4:on 5:on 6:off

quota_nld 0:off 1:off 2:off 3:off 4:off 5:off 6:off

rdisc 0:off 1:off 2:off 3:off 4:off 5:off 6:off

restorecond 0:off 1:off 2:off 3:off 4:off 5:off 6:off

rpcbind 0:off 1:off 2:on 3:off 4:on 5:on 6:off

rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off

saslauthd 0:off 1:off 2:off 3:on 4:off 5:off 6:off

sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off

smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off

snmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

snmptrapd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

udev-post 0:off 1:on 2:on 3:off 4:on 5:on 6:off

winbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off

xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off

xinetd based services:

chargen-dgram: off

chargen-stream: off

daytime-dgram: off

daytime-stream: off

discard-dgram: off

discard-stream: off

echo-dgram: off

echo-stream: off

finger: off

ntalk: off

rsync: off

talk: off

tcpmux-server: off

time-dgram: off

time-stream: off

方法二:如何在 System V(SysV)系统中查看运行的服务

另外一种在 Linux 系统上列出运行的服务的方法是使用 initctl 命令:

initctl list

rc stop/waiting

tty (/dev/tty3) start/running, process 1740

tty (/dev/tty2) start/running, process 1738

tty (/dev/tty1) start/running, process 1736

tty (/dev/tty6) start/running, process 1746

tty (/dev/tty5) start/running, process 1744

tty (/dev/tty4) start/running, process 1742

plymouth-shutdown stop/waiting

control-alt-delete stop/waiting

rcS-emergency stop/waiting

readahead-collector stop/waiting

kexec-disable stop/waiting

quit-plymouth stop/waiting

rcS stop/waiting

prefdm stop/waiting

init-system-dbus stop/waiting

ck-log-system-restart stop/waiting

readahead stop/waiting

ck-log-system-start stop/waiting

splash-manager stop/waiting

start-ttys stop/waiting

readahead-disable-services stop/waiting

ck-log-system-stop stop/waiting

rcS-sulogin stop/waiting

serial stop/waiting

方法三:如何在 systemd 系统中查看运行的服务

以下命令帮助我们列出 systemd 系统中所有服务:

systemctl

UNIT LOAD ACTIVE SUB DESCRIPTION

sys-devices-virtual-block-loop0.device loaded active plugged /sys/devices/virtual/block/loop0

sys-devices-virtual-block-loop1.device loaded active plugged /sys/devices/virtual/block/loop1

sys-devices-virtual-block-loop2.device loaded active plugged /sys/devices/virtual/block/loop2

sys-devices-virtual-block-loop3.device loaded active plugged /sys/devices/virtual/block/loop3

sys-devices-virtual-block-loop4.device loaded active plugged /sys/devices/virtual/block/loop4

sys-devices-virtual-misc-rfkill.device loaded active plugged /sys/devices/virtual/misc/rfkill

sys-devices-virtual-tty-ttyprintk.device loaded active plugged /sys/devices/virtual/tty/ttyprintk

sys-module-fuse.device loaded active plugged /sys/module/fuse

sys-subsystem-net-devices-enp0s3.device loaded active plugged 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter)

-.mount loaded active mounted Root Mount

dev-hugepages.mount loaded active mounted Huge Pages File System

dev-mqueue.mount loaded active mounted POSIX Message Queue File System

run-user-1000-gvfs.mount loaded active mounted /run/user/1000/gvfs

run-user-1000.mount loaded active mounted /run/user/1000

snap-core-3887.mount loaded active mounted Mount unit for core

snap-core-4017.mount loaded active mounted Mount unit for core

snap-core-4110.mount loaded active mounted Mount unit for core

snap-gping-13.mount loaded active mounted Mount unit for gping

snap-termiusx2dapp-8.mount loaded active mounted Mount unit for termius-app

sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System

sys-kernel-debug.mount loaded active mounted Debug File System

acpid.path loaded active running ACPI Events Check

cups.path loaded active running CUPS Scheduler

systemd-ask-password-plymouth.path loaded active waiting Forward Password Requests to Plymouth Directory Watch

systemd-ask-password-wall.path loaded active waiting Forward Password Requests to Wall Directory Watch

init.scope loaded active running System and Service Manager

session-c2.scope loaded active running Session c2 of user magi

accounts-daemon.service loaded active running Accounts Service

acpid.service loaded active running ACPI event daemon

anacron.service loaded active running Run anacron jobs

apache2.service loaded active running The Apache HTTP Server

apparmor.service loaded active exited AppArmor initialization

apport.service loaded active exited LSB: automatic crash report generation

aptik-battery-monitor.service loaded active running LSB: start/stop the aptik battery monitor daemon

atop.service loaded active running Atop advanced performance monitor

atopacct.service loaded active running Atop process accounting daemon

avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

colord.service loaded active running Manage, Install and Generate Color Profiles

console-setup.service loaded active exited Set console font and keymap

cron.service loaded active running Regular background program processing daemon

cups-browsed.service loaded active running Make remote CUPS printers available locally

cups.service loaded active running CUPS Scheduler

dbus.service loaded active running D-Bus System Message Bus

postfix.service loaded active exited Postfix Mail Transport Agent

UNIT 相应的 systemd 单元名称

LOAD 相应的单元是否被加载到内存中

ACTIVE 该单元是否处于活动状态

SUB 该单元是否处于运行状态(LCTT 译注:是较于 ACTIVE 更加详细的状态描述,不同的单元类型有不同的状态。)

DESCRIPTION 关于该单元的简短描述

以下选项可根据类型列出单元:

systemctl list-units –type service

UNIT LOAD ACTIVE SUB DESCRIPTION

accounts-daemon.service loaded active running Accounts Service

acpid.service loaded active running ACPI event daemon

anacron.service loaded active running Run anacron jobs

apache2.service loaded active running The Apache HTTP Server

apparmor.service loaded active exited AppArmor initialization

apport.service loaded active exited LSB: automatic crash report generation

aptik-battery-monitor.service loaded active running LSB: start/stop the aptik battery monitor daemon

atop.service loaded active running Atop advanced performance monitor

atopacct.service loaded active running Atop process accounting daemon

avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

colord.service loaded active running Manage, Install and Generate Color Profiles

console-setup.service loaded active exited Set console font and keymap

cron.service loaded active running Regular background program processing daemon

cups-browsed.service loaded active running Make remote CUPS printers available locally

cups.service loaded active running CUPS Scheduler

dbus.service loaded active running D-Bus System Message Bus

fwupd.service loaded active running Firmware update daemon

getty@tty1.service loaded active running Getty on tty1

grub-common.service loaded active exited LSB: Record successful boot for GRUB

irqbalance.service loaded active running LSB: daemon to balance interrupts for SMP systems

keyboard-setup.service loaded active exited Set the console keyboard layout

kmod-static-nodes.service loaded active exited Create list of required static device nodes for the current kernel

以下选项可帮助您根据状态列出单位,输出与前例类似但更直截了当:

systemctl list-unit-files –type service

UNIT FILE STATE

accounts-daemon.service enabled

acpid.service disabled

alsa-restore.service static

alsa-state.service static

alsa-utils.service masked

anacron-resume.service enabled

anacron.service enabled

apache-htcacheclean.service disabled

apache-htcacheclean@.service disabled

apache2.service enabled

apache2@.service disabled

apparmor.service enabled

apport-forward@.service static

apport.service generated

apt-daily-upgrade.service static

apt-daily.service static

aptik-battery-monitor.service generated

atop.service enabled

atopacct.service enabled

autovt@.service enabled

avahi-daemon.service enabled

bluetooth.service enabled

运行以下命令以查看指定服务的状态:

systemctl | grep apache2

apache2.service loaded active running The Apache HTTP Server

或者,使用以下命令也可查看指定服务的状态:

systemctl status apache2

● apache2.service – The Apache HTTP Server

Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)

Drop-In: /lib/systemd/system/apache2.service.d

└─apache2-systemd.conf

Active: active (running) since Tue 2018-03-06 12:34:09 IST; 8min ago

Process: 2786 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)

Main PID: 1171 (apache2)

Tasks: 55 (limit: 4915)

CGroup: /system.slice/apache2.service

├─1171 /usr/sbin/apache2 -k start

├─2790 /usr/sbin/apache2 -k start

└─2791 /usr/sbin/apache2 -k start

Mar 06 12:34:08 magi-VirtualBox systemd[1]: Starting The Apache HTTP Server…

Mar 06 12:34:09 magi-VirtualBox apachectl[1089]: AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 10.0.2.15. Set the ‘ServerName’ directive globally to suppre

Mar 06 12:34:09 magi-VirtualBox systemd[1]: Started The Apache HTTP Server.

Mar 06 12:39:10 magi-VirtualBox systemd[1]: Reloading The Apache HTTP Server.

Mar 06 12:39:10 magi-VirtualBox apachectl[2786]: AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using fe80::7929:4ed1:279f:4d65. Set the ‘ServerName’ directive gl

Mar 06 12:39:10 magi-VirtualBox systemd[1]: Reloaded The Apache HTTP Server.

执行以下命令,只查看正在运行的服务:

systemctl | grep running

acpid.path loaded active running ACPI Events Check

cups.path loaded active running CUPS Scheduler

init.scope loaded active running System and Service Manager

session-c2.scope loaded active running Session c2 of user magi

accounts-daemon.service loaded active running Accounts Service

acpid.service loaded active running ACPI event daemon

apache2.service loaded active running The Apache HTTP Server

aptik-battery-monitor.service loaded active running LSB: start/stop the aptik battery monitor daemon

atop.service loaded active running Atop advanced performance monitor

atopacct.service loaded active running Atop process accounting daemon

avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

colord.service loaded active running Manage, Install and Generate Color Profiles

cron.service loaded active running Regular background program processing daemon

cups-browsed.service loaded active running Make remote CUPS printers available locally

cups.service loaded active running CUPS Scheduler

dbus.service loaded active running D-Bus System Message Bus

fwupd.service loaded active running Firmware update daemon

getty@tty1.service loaded active running Getty on tty1

irqbalance.service loaded active running LSB: daemon to balance interrupts for SMP systems

lightdm.service loaded active running Light Display Manager

ModemManager.service loaded active running Modem Manager

NetworkManager.service loaded active running Network Manager

polkit.service loaded active running Authorization Manager

使用以下命令查看系统启动时会被启用的服务列表:

systemctl list-unit-files | grep enabled

acpid.path enabled

cups.path enabled

accounts-daemon.service enabled

anacron-resume.service enabled

anacron.service enabled

apache2.service enabled

apparmor.service enabled

atop.service enabled

atopacct.service enabled

autovt@.service enabled

avahi-daemon.service enabled

bluetooth.service enabled

console-setup.service enabled

cron.service enabled

cups-browsed.service enabled

cups.service enabled

display-manager.service enabled

dns-clean.service enabled

friendly-recovery.service enabled

getty@.service enabled

gpu-manager.service enabled

keyboard-setup.service enabled

lightdm.service enabled

ModemManager.service enabled

network-manager.service enabled

networking.service enabled

NetworkManager-dispatcher.service enabled

NetworkManager-wait-online.service enabled

NetworkManager.service enabled

systemd-cgtop 按资源使用情况(任务、CPU、内存、输入和输出)列出控制组:

systemd-cgtop

Control Group Tasks %CPU Memory Input/s Output/s

/ – – 1.5G – –

/init.scope 1 – – – –

/system.slice 153 – – – –

/system.slice/ModemManager.service 3 – – – –

/system.slice/NetworkManager.service 4 – – – –

/system.slice/accounts-daemon.service 3 – – – –

/system.slice/acpid.service 1 – – – –

/system.slice/apache2.service 55 – – – –

/system.slice/aptik-battery-monitor.service 1 – – – –

/system.slice/atop.service 1 – – – –

/system.slice/atopacct.service 1 – – – –

/system.slice/avahi-daemon.service 2 – – – –

/system.slice/colord.service 3 – – – –

/system.slice/cron.service 1 – – – –

/system.slice/cups-browsed.service 3 – – – –

/system.slice/cups.service 2 – – – –

/system.slice/dbus.service 6 – – – –

/system.slice/fwupd.service 5 – – – –

/system.slice/irqbalance.service 1 – – – –

/system.slice/lightdm.service 7 – – – –

/system.slice/polkit.service 3 – – – –

/system.slice/repowerd.service 14 – – – –

/system.slice/rsyslog.service 4 – – – –

/system.slice/rtkit-daemon.service 3 – – – –

/system.slice/snapd.service 8 – – – –

/system.slice/system-getty.slice 1 – – – –

同时,我们可以使用 pstree 命令(输出来自 SysVinit 系统)查看正在运行的服务:

pstree

init-+-crond

|-httpd—2*[httpd]

|-kthreadd/99149—khelper/99149

|-2*[mingetty]

|-mysqld_safe—mysqld—9*[{mysqld}]

|-rsyslogd—3*[{rsyslogd}]

|-saslauthd—saslauthd

|-2*[sendmail]

|-sshd—sshd—bash—pstree

|-udevd

`-xinetd

我们还可以使用 pstree 命令(输出来自 systemd 系统)查看正在运行的服务:

pstree

systemd─┬─ModemManager─┬─{gdbus}

│ └─{gmain}

├─NetworkManager─┬─dhclient

│ ├─{gdbus}

│ └─{gmain}

├─accounts-daemon─┬─{gdbus}

│ └─{gmain}

├─acpid

├─agetty

├─anacron

├─apache2───2[apache2───26[{apache2}]]

├─aptd───{gmain}

├─aptik-battery-m

├─atop

├─atopacctd

├─avahi-daemon───avahi-daemon

├─colord─┬─{gdbus}

│ └─{gmain}

├─cron

├─cups-browsed─┬─{gdbus}

│ └─{gmain}

├─cupsd

├─dbus-daemon

├─fwupd─┬─{GUsbEventThread}

│ ├─{fwupd}

│ ├─{gdbus}

│ └─{gmain}

├─gnome-keyring-d─┬─{gdbus}

│ ├─{gmain}

│ └─{timer}

linux自动备份文件 并上传到远程服务器 脚本实现

      mkdir -p /backup/bakdata  #新建数据备份目录
(2)完成备份脚本操作
新建脚本文件
vi bakdata.sh
添加以下内容:

#!/bin/sh
dateTime=`date +%Y_%m_%d`    #当前系统时间
days=7    #删除7天前的备份数据s
orowner=bakuser   # 备份到此用户下
bakdescdir=/DATA/bakmdata     #备份文件到该路径
bakdata=$orowner”_”$dateTime.tar.gz   #备份文件名
baklog=$orowner”_”$dateTime.log    #备份日志
baksrcdir=/DATA/www/moodledata   #需要备份的文件
remotePath=/DATA/moodle/bakmooldedata   #远程服务器的路径

cd $bakdescdir    #进入备份目录
mkdir -p $orowner   #按需要备份的用户创建目录
cd $orowner   #进入目录
echo “backup start at $dateTime” > $baklog
echo “————————–” >>$baklog
tar -zcvf $bakdata $baksrcdir $baklog    #压缩备份文件和日志文件

find $bakdescdir/$orowner -type f -name “*.log” -exec rm {} \;   #删除日志文件
find $bakdescdir/$orowner -type f -name “*.tar.gz” -mtime +$days -exec  rm -rf {} \;#删除7天前的备份(注意:{} \中间有空格)
scp  $bakdescdir/$orowner/$bakdata 10.6.108.79:$remotePath  #上传到远程服务器
(3)添加脚本执行权限
chmod +x /backup/oracledata/ordatabak.sh

  #添加脚本执行权限
(4)编辑系统任务执行计划
crontab -e
输入一下信息“:

00 01 * * * /DATA/bakdata/bakdata.sh#每天凌晨1点,以oracle用户执行ordatabak.sh备份文件:wq! #保存退出

重启crontab

service crond restart

从此每天的凌晨1点 系统会自动完成数据库的备份,压缩,并上传到远程服务器的指定路径下

Linux定时任务Crontab命令详解

linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

一、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:

文件:

/etc/cron.deny

说明:

该文件中所列用户不允许使用crontab命令

文件:

/etc/cron.allow

说明:

该文件中所列用户允许使用crontab命令

文件:

/var/spool/cron/

说明:

所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

二、crond服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

/sbin/service crond status //启动服务

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

三、crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

4.常用方法:

1). 创建一个新的crontab文件

在 考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

保存并退出。确信前面5个域用空格分隔。

在 上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:

$ crontab davecron

现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

2). 列出crontab文件

为了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

$ crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3). 编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

$ crontab -e

可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

4). 删除crontab文件

要删除crontab文件,可以用:

$ crontab -r

5). 恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。

我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。

5.使用实例

实例1:每1分钟执行一次command
命令:
* * * * * command

实例2:每小时的第3和第15分钟执行
命令:
3,15 * * * * command

实例3:在上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * * command

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 */2 * * command

实例5:每个星期一的上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * 1 command

实例6:每晚的21:30重启smb
命令:
30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb
命令:
45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
命令:
0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb
命令:
0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb
命令:
* */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb
命令:
* 23-7/1 * * * /etc/init.d/smb restart

实例13:每月的4号与每周一到周三的11点重启smb
命令:
0 11 4 * mon-wed /etc/init.d/smb restart

实例14:一月一号的4点重启smb
命令:
0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本
命令:
01 * * * * root run-parts /etc/cron.hourly
说明:
run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

四、使用注意事项

注意环境变量问题
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度
系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。

*实例笔记:个简单的自动备份脚本

以下是脚本test.sh的内容

#!/bin/bash

FILENAME=`date +%Y%m%d`

tar -zcvf /backup/$FILENAME /home/user

然后设置cronjob

命令 crontab -e 

添加一行以下数据 表示每天20点1分执行一次脚本。

1 20 * * * /bin/test.sh  

/*test最好是加上绝对路径,这样不容易出错*/

test.sh放在目录/bin 下面

*TAR 实现 Linux 操作系统自动备份

Tar 命令工具除了用于日常打包、解压源码包或者压缩包之外,最大的亮点是还可以用于 Linux 操作系统文件及目录的备份,使用 tar -g 可以基于 GNU 格式的增量备份,备份原理是基于检查目录或者文件的 atime、mtime、ctime 属性是否被修改。文件及目录时间属性详解如下:
❑ 文件被访问的时间(Access time,atime);
❑ 文件内容被改变的时间(Modified time,mtime);
❑ 文件写入、权限更改的时间(Change time,ctime)。
总结,更改文件内容 mtime 和 ctime 都会改变,但 ctime 可以在 mtime 未发生变化时被更改,例如修改文件权限,文件 mtime 时间不变,而 ctime 时间改变。
TAR 增量备份案例演示步骤如下:

  1. /root 目录创建 test 文件夹,同时在 test 文件夹中,新建test1.txt,test2.txt 文件,如图所示:
[root@hecs-x-medium-2-linux-20200611091300 ~]# cd /root
[root@hecs-x-medium-2-linux-20200611091300 ~]# ls
[root@hecs-x-medium-2-linux-20200611091300 ~]# mkdir test
[root@hecs-x-medium-2-linux-20200611091300 ~]# cd test/
[root@hecs-x-medium-2-linux-20200611091300 test]# touch test1.txt test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 使用 tar 命令第一次完整备份 test 文件夹中的内容,-g 指定快照 snapshot文件,第一次没有该文件则会自动创建,如图所示
[root@hecs-x-medium-2-linux-20200611091300 test]# pwd
/root/test
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -g /data/backup/snapshot -czvf /data/backup/2020test.tar.gz *
test1.txt
test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# cat /data/backup/snapshot
GNU tar-1.26-2
1592364124756978502[root@hecs-x-medium-2-linux-20200611091300 test]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 使用 tar 命令第一次完整备份 test文件夹中之后,会生成快照文件:/data/backup/snapshot,后期增量备份会以 snapshot 文件为参考,在 test文件夹中再创建 test3.txt test4.txt 文件,然后通过 tar 命令增量备份 test目录所有内容,如图所示:
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# pwd
/root/test
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# touch test3.txt test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt  test3.txt  test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -g /data/backup/snapshot -czvf /data/backup/2020test_add1.tar.gz *
test3.txt
test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如上图 所示,增量备份时,需-g 指定第一次完整备份的快照 snapshot 文件,同时增量打包的文件名不能跟第一次备份后的文件名重复,通过 tar –tf 可以查看打包后的文件内容

[root@hecs-x-medium-2-linux-20200611091300 test]# tar -tf /data/backup/2020test_add1.tar.gz
test3.txt
test4.txt

  • 1
  • 2
  • 3
  • 4

在test4.txt文件中插入一部分内容,再新建test5.txt文件,修改test1.txt文件权限,再进行一次增量备份

[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt  test3.txt  test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# vi test4.txt ##插入内容
[root@hecs-x-medium-2-linux-20200611091300 test]# touch test5.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt  test3.txt  test4.txt  test5.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# cat test3.txt 
[root@hecs-x-medium-2-linux-20200611091300 test]# chmod 777 test1.txt ##修改权限
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -g /data/backup/snapshot -czvf /data/backup/2020test_add2.tar.gz *
test4.txt
test5.txt
test1.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -tf /data/backup/2020test_add2.tar.gz
test4.txt
test5.txt
test1.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Shell+TAR 实现增量备份

企业中日常备份的数据包括/boot、/etc、/root、/data 目录等,备份的策略参考:每周 1-6 执行增量备份,每周日执行全备份。同时在企业中备份操作系统数据均使用Shell 脚本完成,此处auto_backup.sh 脚本供参考

#!/bin/sh
#define
SOURCE_DIR=(
    $*
)
TARGET_DIR=/data/backup/
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
WEEK=`date +%u`
FILES=system_backup.tgz
CODE=$?
if
    [ -z "$*" ];then
    echo -e "Please Enter Your Backup Files or Directories\n--------------------------------------------\nExample $0 /boot /etc ......"
    exit
fi
#Determine Whether the Target Directory Exists
if
    [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
    mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
    echo "This $TARGET_DIR is Created Successfully !"
fi
#EXEC Full_Backup Function Command
Full_Backup()
{
if
    [ "$WEEK" -eq "7" ];then
    rm -rf $TARGET_DIR/snapshot
    cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
    [ "$CODE" == "0" ]&&echo -e  "--------------------------------------------\nThese Full_Backup System Files Backup Successfully !"
fi
}
#Perform incremental BACKUP Function Command
Add_Backup()
{
   cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;
if
    [ -f $TARGET_DIR/$YEAR/$MONTH/$DAY/$FILES ];then
    read -p "These $FILES Already Exists, overwrite confirmation yes or no ? : " SURE
    if [ $SURE == "no" -o $SURE == "n" ];then
    sleep 1 ;exit 0
    fi
#Add_Backup Files System
    if
        [ $WEEK -ne "7" ];then
        cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $$_$FILES `echo ${SOURCE_DIR[@]}`
        [ "$CODE" == "0" ]&&echo -e  "-----------------------------------------\nThese Add_Backup System Files Backup Successfully !"
   fi
else
   if
      [ $WEEK -ne "7" ];then
      cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
      [ "$CODE" == "0" ]&&echo -e  "-------------------------------------------\nThese Add_Backup System Files Backup Successfully !"
   fi
fi
}
Full_Backup;Add_Backup
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

增加到定时任务中执行

crontab -e
0 1 * * * /bin/sh /data/sh/auto_backup.sh /boot /etc/ >> /tmp/back.log 2>&1