如何停⽌和禁⽤Linux系统中的不需要的服务
从Linux中删除不需要的服务
在本⽂中,我们将讨论⼀些您不需要的不需要的应⽤程序和服务,但它们是在操作系统安装期间默认安装的,并且不知不觉地开始吃您的系统资源。
让我们⾸先知道使⽤以下命令在系统上运⾏什么样的服务。
[avishek@howtoing]# ps ax
⽰例输出
PID TTY      STAT  TIME COMMAND
2 ?        S      0:00 [kthreadd]
3 ?        S      0:00  \_ [migration/0]
4 ?        S      0:09  \_ [ksoftirqd/0]
5 ?        S      0:00  \_ [migration/0]
6 ?        S      0:24  \_ [watchdog/0]
7 ?        S      2:20  \_ [events/0]
8 ?        S      0:00  \_ [cgroup]
9 ?        S      0:00  \_ [khelper]
10 ?        S      0:00  \_ [netns]
11 ?        S      0:00  \_ [async/mgr]
12 ?        S      0:00  \_ [pm]
13 ?        S      0:16  \_ [sync_supers]
14 ?        S      0:15  \_ [bdi-default]
15 ?        S      0:00  \_ [kintegrityd/0]
16 ?        S      0:49  \_ [kblockd/0]
17 ?        S      0:00  \_ [kacpid]
18 ?        S      0:00  \_ [kacpi_notify]
19 ?        S      0:00  \_ [kacpi_hotplug]
20 ?        S      0:00  \_ [ata_aux]
21 ?        S    58:46  \_ [ata_sff/0]
22 ?        S      0:00  \_ [ksuspend_usbd]
23 ?        S      0:00  \_ [khubd]
24 ?        S      0:00  \_ [kseriod]
.....
现在,让我们快速浏览⼀下使⽤接受连接(端⼝)进程,如下图所⽰。
[avishek@howtoing]# netstat -lp
⽰例输出
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address              Foreign Address            State      PID/Program name
tcp        0      0 *:31138                    *:*                        LISTEN      1485/rpc.statd
tcp        0      0 *:mysql                    *:*                        LISTEN      1882/mysqld
tcp        0      0 *:sunrpc                    *:*                        LISTEN      1276/rpcbind
tcp        0      0 *:ndmp                      *:*                        LISTEN      2375/perl
tcp        0      0 *:webcache                  *:*                        LISTEN      2312/monitorix-http
tcp        0      0 *:ftp                      *:*                        LISTEN      2174/vsftpd
tcp        0      0 *:ssh                      *:*                        LISTEN      1623/sshd
tcp        0      0 localhost:ipp              *:*                        LISTEN      1511/cupsd
tcp        0      0 localhost:smtp              *:*                        LISTEN      2189/sendmail
tcp        0      0 *:cbt                      *:*                        LISTEN      2243/java
tcp        0      0 *:websm                    *:*                        LISTEN      2243/java
tcp        0      0 *:nrpe                      *:*                        LISTEN      1631/xinetd
tcp        0      0 *:xmltec-xmlmail            *:*                        LISTEN      2243/java
tcp        0      0 *:xmpp-client              *:*                        LISTEN      2243/java
tcp        0      0 *:hpvirtgrp                *:*                        LISTEN      2243/java
tcp        0      0 *:5229                      *:*                        LISTEN      2243/java
tcp        0      0 *:sunrpc                    *:*                        LISTEN      1276/rpcbind
tcp        0      0 *:http                      *:*                        LISTEN      6439/httpd
tcp        0      0 *:oracleas-https            *:*                        LISTEN      2243/java
.
...
在上⾯的输出中,您注意到您可能不需要在服务器上的⼀些应⽤程序,但它们仍然运⾏如下:
smbd和nmbd
smbd和nmbd是Samba进程的守护程序。你真的需要在Windows或其他机器上导出smb共享。如果没有!为什么这些进程运⾏?您可以安全地终⽌这些进程,并禁⽌它们在下次引导计算机时⾃动启动。
2. Telnet
你需要通过互联⽹或局域⽹进⾏双向交互式⽂本导向通信吗?如果没有!杀死这个进程并关闭它从启动开始。
3. rlogin
您需要通过⽹络登录到另⼀台主机。如果没有!杀死此进程并禁⽌它在启动时⾃动启动。
rexec
远程进程执⾏也称为rexec,您可以在远程计算机上执⾏shell命令。如果不需要在远程机器上执⾏shell
命令,只需杀死该进程即可。
5. FTP
您需要通过Internet将⽂件从⼀个主机传输到另⼀个主机吗?如果不是,您可以安全地停⽌服务。
6.⾃动挂载
你需要⾃动挂载不同的⽂件系统来启动⽹络⽂件系统吗?如果没有!为什么这个进程正在运⾏?为什么要让此应⽤程序使⽤您的资源?杀死进程并禁⽌它⾃动启动。
7.命名
你需要运⾏NameServer(DNS)吗?如果不是在地球上迫使你运⾏这个过程,并允许吃掉你的资源。先停⽌运⾏的进程,然后在启动时关闭它运⾏它。
8.lpd
lpd是可以打印到该服务器的打印机守护程序。如果您不需要从服务器打印,则可能是您的系统资源正在被占⽤。
9.Inetd
您是否正在运⾏任何inetd服务?如果你运⾏独⽴的应⽤程序像ssh使⽤其他独⽴的应⽤程序像Mysql,Apache等,那么你不需要inetd。更好地杀死进程,并禁⽤它⾃动下次启动。
10. portmap
Portmap是开放⽹络计算远程过程调⽤(ONC RPC)并使⽤守护程序rpc.portmap和rpcbind。如果这些进程正在运⾏,则表⽰您正在运⾏NFS服务器。如果NFS服务器运⾏未注意到意味着您的系统资源被不必要地⽤尽。
如何在Linux中杀死进程
为了杀死在Linux下运⾏的过程中,使⽤' 杀PID“命令。但是,在运⾏Kill命令之前,我们必须知道进程的PID。例如,在这⾥我想个' 的cupsd“进程的PID。
[avishek@howtoing]# ps ax | grep cupsd
1511 ?        Ss    0:00 cupsd -C /etc/f
所以,'cupsd将 '处理的PID为“1511”。要终⽌该PID,请运⾏以下命令。
[avishek@howtoing]# kill -9 1511
要了解更多关于他们的榜样kill命令,阅读⽂章
如何在Linux中禁⽤服务
在基于Red Hat分发⽐如Fedora和CentOS,使⽤⼀个名为“脚本 ”在Linux中启⽤和禁⽤正在运⾏的服务。
例如,允许在系统启动时禁⽤Apache Web服务器。
[avishek@howtoing]# chkconfig httpd off
[avishek@howtoing]# chkconfig httpd --del
在基于Debian的发⾏版,如Ubuntu的,Linux Mint的和其他基于Debian的发⾏版使⽤⼀种叫做更新- rc.d脚本。
例如,要在系统启动时禁⽤Apache服务,请执⾏以下命令。在这⾥,'-f'选项代表⼒量是强制性的。
[avishek@howtoing]# update-rc.d -f apache2 remove
进⾏这些更改后,系统下次将启动,⽽不需要这些UN必要的过程,实际上将会节省我们的系统资源,并且服务器将更实⽤,快速,安全和安全。
很多时候最好把操作命令写成脚本的形式:
Ubuntu 16.04设置rc.local开机启动命令/脚本的⽅法(通过update-rc.d管理Ubuntu开机启动程序/服务)--debian与ubuntu类似
注意:rc.local脚本⾥⾯启动的⽤户默认为root权限。
⼀、rc.local脚本
rc.local脚本是⼀个Ubuntu开机后会⾃动执⾏的脚本,我们可以在该脚本内添加命令⾏指令。该脚本位于/etc/路径下,需要root权限才能修改。
该脚本具体格式如下:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
注意: ⼀定要将命令添加在exit 0之前。⾥⾯可以直接写命令或者执⾏Shell脚本⽂件sh。
⼆、关于放在rc.local⾥⾯时不启动的问题:
1、可以先增加⽇志输出功能,来查看最终为什么这个脚本不启动的原因,这个是Memcached启动时的样例⽂件:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#log
exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file
exec 1>&2                  # send stdout to the same log file
set -x                    # tell sh to display commands before execution
#Memcached
/usr/local/memcache/bin/memcached -p 11211 -m 64m -d -u root
exit 0
2、rc.local⽂件头部/bin/sh修改为/bin/bash
3、如果是执⾏sh⽂件,那么要赋予执⾏权限sudo chmod +x xxx.sh,然后启动时加上sudo sh xxx.sh
三、 update-rc.d增加开机启动服务
给Ubuntu添加⼀个开机启动脚本,操作如下:
1、新建个脚本⽂件new_service.sh
#!/bin/bash
# command content
exit 0
2、设置权限
sudo chmod 755 new_service.sh
#或者
sudo chmod +x new_service.sh
3、把脚本放置到启动⽬录下
sudo mv new_service.sh /etc/init.d/
4、将脚本添加到启动脚本
执⾏如下指令,在这⾥90表明⼀个优先级,越⾼表⽰执⾏的越晚
cd /etc/init.d/
sudo update-rc.d new_service.sh defaults 90
5、移除Ubuntu开机脚本
sudo update-rc.d -f new_service.sh remove
6、通过sysv-rc-conf来管理上⾯启动服务的启动级别等,还是开机不启动
sudo sysv-rc-conf
7、update-rc.d的详细参数
使⽤update-rc.d命令需要指定脚本名称和⼀些参数,它的格式看起来是这样的(需要在 root 权限下):
update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] <basename> defaults
update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
update-rc.d <basename> start|stop <NN> <runlevels>
-n: not really
-f: force
其中:
disable|enable:代表脚本还在/etc/init.d中,并设置当前状态是⼿动启动还是⾃动启动。
start|stop:代表脚本还在/etc/init.d中,开机,并设置当前状态是开始运⾏还是停⽌运⾏。(启⽤后可配置开始运⾏与否)
NN:是⼀个决定启动顺序的两位数字值。(例如90⼤于80,因此80对应的脚本先启动或先停⽌)
runlevels:则指定了运⾏级别。
实例:
(1)、添加⼀个新的启动脚本sample_init_script,并且指定为默认启动顺序、默认运⾏级别(还记得前⾯说的吗,⾸先要有实际的⽂件存在于/etc/init.d,即若⽂件/etc/init.d/sample_init_script不存在,则该命令不会执⾏):
update-rc.d sample_init_script defaults
上⼀条命令等效于(中间是⼀个英⽂句点符号):
update-rc.d sample_init_script start 20 2 3 4 5 . stop 20 0 1 6
(2)、安装⼀个启动脚本sample_init_script,指定默认运⾏级别,但启动顺序为50:
update-rc.d sample_init_script defaults 50
linux中netstat命令
(3)、安装两个启动脚本A、B,让A先于B启动,后于B停⽌:
update-rc.d A 10 40
update-rc.d B 20 30
(4)、删除⼀个启动脚本sample_init_script,如果脚本不存在则直接跳过:
update-rc.d -f sample_init_script remove
这⼀条命令实际上做的就是⼀⼀删除所有位于/etc/rcX.d⽬录下指向/etc/init.d中sample_init_script的链接(可能存在多个链接⽂
件),update-rc.d只不过简化了这⼀步骤。
(5)禁⽌Apache/MySQL相关组件开机⾃启:
update-rc.d -f apache2 remove
update-rc.d -f mysql remove
8、服务的启动停⽌状态
#通过service,⽐如
sudo service xxx status
sudo service xxx start
sudo service xxx stop
sudo service xxx restart
9、查看全部服务列表
sudo service --status-all
参考:
rc.local不启动的原因:
Linux 编写⼀个简单的⼀键脚本
Linux中我们安装软件或者⼀些常⽤操作,都会接触很多命令,有时在关键时刻往往因为忘了⼀些简单的命令⽽苦恼,这时,我们不妨把命令写成可执⾏的批量脚本,可以减少很多重复⽽⼜容易忘记的代码,写成⼀键脚本还有⼀个好处就是⽅便迁移,可以直接将写好的sh⽂件在其他Linux平台运⾏。
格式:
⽂件后缀.sh
第⼀⾏代码需要指定路径来执⾏程序
#!/bin/sh 或#!/bin/bash
建议由后者,参见
⼀般⼀键脚本会要求⽤户输⼊各种选项:
1 #提⽰“请输⼊姓名”并等待30秒,把⽤户的输⼊保存⼊变量name中
2 read -t 30 -p "请输⼊⽤户名称:" name
3echo -e "\n"
4echo"⽤户名为:$name"
5 #提⽰“请输⼊密码”并等待30秒,把⽤户的输⼊保存⼊变量age中,输⼊内容隐藏
6 read -t 30 -s -p "请输⼊⽤户密码:" age
7echo -e "\n"
8echo"⽤户密码为:$age"
9 #提⽰“请输⼊性别”并等待30秒,把⽤户的输⼊保存⼊变量sex中,只接受⼀个字符输⼊
10 read -t 30 -n 1 -p "请输⼊⽤户性别:" sex
11echo -e "\n"
12echo"性别为$sex"
逻辑判断:
1 read -t 30 -p "请输⼊⽤户名称:" isYes
2if [ "${isYes}" = "yes" ]; then
3echo"输⼊了Yes"
4fi
执⾏并⾏脚本:
1wget -c / && tar zxf && cd xx && ./install.sh
⽅法调⽤:
1 print_hello()
2 {
3echo"hello"
4 }
5 print_hello
echo命令
echo命令⽤于在shell中打印shell变量的值,或者直接输出指定的字符串。linux的echo命令,在shell编
程中极为常⽤, 在终端下打印变量value的时候也是常常⽤到的,因此有必要了解下echo的⽤法echo命令的功能是在显⽰器上显⽰⼀段⽂字,⼀般起到⼀个提⽰的作⽤。
语法
echo(选项)(参数)
选项
-e:激活转义字符。
使⽤-e选项时,若字符串中出现以下字符,则特别加以处理,⽽不会将它当成⼀般⽂字输出:
\a 发出警告声;
\b 删除前⼀个字符;
\c 最后不加上换⾏符号;
\f 换⾏但光标仍旧停留在原来的位置;