当前位置:首页 » 操作系统 » linuxshell实现

linuxshell实现

发布时间: 2022-08-02 07:44:25

‘壹’ linux前台进程独占shell是怎么实现的

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。
1.命令格式:
kill[参数][进程号]
2.命令功能:
发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。
3.命令参数:
-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 指定发送信号
-u 指定用户
注意:
1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:
kill -2 123
它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。
2、kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。
3、可以向多个进程发信号或终止它们。
4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。
5、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。
4.使用实例:
实例1:列出所有信号名称
命令:
kill -l
输出:
[root@localhost test6]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
说明:
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
实例2:得到指定信号的数值
命令:
输出:
[root@localhost test6]# kill -l KILL
9[root@localhost test6]# kill -l SIGKILL
9[root@localhost test6]# kill -l TERM
15[root@localhost test6]# kill -l SIGTERM
15[root@localhost test6]#
说明:
实例3:先用ps查找进程,然后用kill杀掉
命令:
kill 3268
输出:
[root@localhost test6]# ps -ef|grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
[root@localhost test6]# kill 3268
[root@localhost test6]# kill 3268
-bash: kill: (3268) - 没有那个进程
[root@localhost test6]#
说明:
实例4:彻底杀死进程
命令:
kill –9 3268
输出:
[root@localhost test6]# ps -ef|grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
[root@localhost test6]# kill –9 3268
[root@localhost test6]# kill 3268
-bash: kill: (3268) - 没有那个进程
[root@localhost test6]#
说明:
实例5:杀死指定用户所有进程
命令:
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux
输出:
[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux)
[root@localhost ~]# kill -u peidalinux
说明:
方法一,过滤出hnlinux用户进程并杀死
实例6:init进程是不可杀的
命令:
kill -9 1
输出:
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17563 17534 0 17:37 pts/1 00:00:00 grep init
[root@localhost ~]# kill -9 1
[root@localhost ~]# kill -HUP 1
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17565 17534 0 17:38 pts/1 00:00:00 grep init
[root@localhost ~]# kill -KILL 1
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17567 17534 0 17:38 pts/1 00:00:00 grep init
[root@localhost ~]#
说明:
init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!
,

‘贰’ 用shell实现一个在Linux环境下运行的命令行工具

自己编程实现一个shell?stupidShell

‘叁’ linux 编写一个shell脚本文件,实现以下功能

#!/bin/bash
whiletrue
do
cat<<END
启动Apache(a)
启动Mysql(m)
启动Samba(s)
启动ftp(f)
启动DNS(d)
退出脚本(E)
END
read-p"请输入要执行的操作:"choice
case$choicein
a)
servicehttpdstart
;;
m)
servicemysqldstart
;;
s)
servicesambastart
;;
f)
servicevsftpdstart
;;
d)
servicenamedstart
;;
E)
exit
;;
*)
echo"输入有误,请输入字母a/m/s/f/d启动相应的服务!"
;;
esac
done

这是模板,纯手打。其中的service httpd start之类的可以换成具体的命令,也可以加上if判断。

针对按什么键执行什么操作用case判断最方便

其中

a)的意思是如果$choice等于a的话则执行什么什么

m)的意思是如果$choice等于m的话则之姓什么什么

其余同理

*)的意思是如果没有以上的a) m) f)...的话就会匹配到这一行,就会输出:输入有误,请输入字母a/m/s/f/d启动相应的服务。

read -p "请输入要执行的操作:" choice //这是个交互式的命令,会输出"请输入要执行的操"作到显示器上,然后将你输入的值赋值给变量choice 然后再用case判断变量choice。

if判断也可以。根据个人喜好来。

case xxx in

x)

;;

y)

;;

*)

;;

这是语法。

‘肆’ linux下shell如何实现以下功能

Linux中增加软路由的两种方法
第一种:
route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.254 dev eth0
/* 增加一条网络172.16.6.0/24 经过172.16.2.254 eth0 */
/* -net增加网络 -host增加主机 netmask 子网掩码 gw 网关 dev 装置,设备,这里是你的网卡名*/
route del gw 172.16.2.254 /* 删除默认网关172.16.2.254 */
route del -net 172.16.86.0/24 /* 删除默认网络172.16.86.0 */
route /* 显示当前路由表 */
常用的是这种方式,但有时你在删除或一条软路由时会不起作用,会有什么提示:
SIOCADDRT: 无法接触网路
所以这时用如下的这种方法就可以了
第二种:
实现的功能和上面的一样
ip route add 172.16.6.0/24 via 172.16.2.254 dev eth0
ip route del gw 172.16.2.254
ip route del 172.16.6.0/24 dev eth0
ip route

删除的方法:
添加路由:
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
删除路由:
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth0
添加默认路由:
route add default gw 10.0.0.1
删除默认路由:
route del default gw 10.0.0.1
或者
route del default

---------------------------------------------------------------------------------------
linux下添加路由的方法:
一:使用 route 命令添加
使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法:
//添加到主机的路由
# route add –host 192.168.168.110 dev eth0
# route add –host 192.168.168.119 gw 192.168.168.1
//添加到网络的路由
# route add –net IP netmask MASK eth0
# route add –net IP netmask MASK gw IP
# route add –net IP/24 eth1
//添加默认网关
# route add default gw IP
//删除路由
# route del –host 192.168.168.110 dev eth0
二:在linux下设置永久路由的方法:
1.在/etc/rc.local里添加
方法:
route add -net 192.168.3.0/24 dev eth0
route add -net 192.168.2.0/24 gw 192.168.3.254
2.在/etc/sysconfig/network里添加到末尾
方法:GATEWAY=gw-ip 或者 GATEWAY=gw-dev
3./etc/sysconfig/static-router :
any net x.x.x.x/24 gw y.y.y.y

‘伍’ linux shell 如何实现浮点运算

linux shell本身只是一个脚本语言,使用操作系统的命令或已安装的程序进行运算。你出的题咋一看有难度,实际上是个伪命题,只要有个已经安装好的支持高精度浮点运算的支持外部调用的计算器程序,写个shell实现这个命题太简单了。如果只是依赖操作系统内置的计算器,那就复杂很多。需要考虑把数字转成文本,进行截断后,再转成数字,分段进行计算,然后再将结果进行组合,最终结果需要以文本方式输出,理论上也可以实现。

‘陆’ 在linux中如何在代码中实现shell中实现的功能

(1)建立一个目录 mkdir -p /var/run/fruinfo/
(2)新建并编辑这个文件 /var/run/fruinfo/LCHAS
文件里面写入N,这个N每次都不同,可以在执行脚本时候定义,然后保存退出
(3)建立一个目录 mkdir -p /var/run/frus/
(4)新建编辑这个文件 /var/run/frus/slot
文件里面写入X,这个X每次都不同,可以在执行脚本时候定义,然后保存退出

‘柒’ Linux:用shell如何实现读取一个字符串的第n个字符呢

代码如下:

str="/home/gateman"

if [ ${str:0:1} = "/" ]; then

echo "yes'

fi

${str:0:1} 中0表示从第几个字符开始,1表示截取多长。

Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本,常见的脚本解释器有:

bash:是Linux标准默认的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。

sh:由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。

另外还有:ash、 csh、 ksh等。

(7)linuxshell实现扩展阅读

Linux shell 截取字符变量的前8位:

实现方法有如下几种:

expr substr “$a” 1 8

echo $a|awk ‘{print substr(,1,8)}’

echo $a|cut -c1-8

echo $

expr $a : ‘(.\).*’

echo $a|dd bs=1 count=8 2>/dev/null

按照指定要求分割:

比如获取后缀名

ls -al | cut -d “.” -f2

小结:shell对应字符串的处理方法很多,根据需求灵活选择。

在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

‘捌’ 帮忙在linux采用shell脚本来实现一些功能

sed 's/ABCD1/ABCD2/g' <filename> > <filename>

把上述这句话,放在/etc/bashrc 最后那里。

‘玖’ Linux下如何实现shell多线程编程以提高应用程序的响应

Linux中多线程编程拥有提高应用程序的响应、使多cpu系统更加有效等优点,下面小编将通过Linux下shell多线程编程的例子给大家讲解下多线程编程的过程,一起来了解下吧。

#!/bin/bash

#———————————————————————————–

# 此例子说明了一种用wait、read命令模拟多线程的一种技巧

# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况

# 还说明了多线程的控制

#———————————————————————————–

function a_sub

{

# 此处定义一个函数,作为一个线程(子进程)

sleep 3 # 线程的作用是sleep 3s

}

tmp_fifofile=“/tmp/$.fifo” mkfifo $tmp_fifofile # 新建一个fifo类型的文件

exec 6《》$tmp_fifofile # 将fd6指向fifo类型

rm $tmp_fifofile thread=15 # 此处定义线程数

for

((i=0;i《$thread;i++));do echo

done 》&6 # 事实上就是在fd6中放置了$thread个回车符

for

((i=0;i《50;i++));do # 50次循环,可以理解为50个主机,或其他

read -u6 # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,

# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制

{ # 此处子进程开始执行,被放到后台

a_sub &&

{ # 此处可以用来判断子进程的逻辑

echo “a_sub is finished”

}

||

{ echo “sub error”

}

echo 》&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个

}

& done wait # 等待所有的后台子进程结束

exec 6》&- # 关闭df6 exit 0

说明:

此程序中的命令

mkfifo tmpfile

和linux中的命令

mknod tmpfile p

效?果相同。区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要

exec 6《》$tmp_fifofile # 将fd6指向fifo类型

如果没有这句,在向文件$tmp_fifofile或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出。

通过运行命令:

time 。/multithread.sh 》/dev/null

最终运算时间: 50/15 = 3组(每组15)+1组(5个《15 组成一个组)= 4组,每组花费时间:3秒,

则 3 * 4 = 12 秒。

传统非多线程的代码 运算时间: 50 * 3 = 150 秒。

上面就是Linux下shell多线程编程的实例介绍了,使用多线程编程还能够改善程序结构,有兴趣的朋友不妨试试看吧。

‘拾’ 在linux中,如何编写一个shell脚本来实现如下功能

#!/usr/bin/expect
set timeout 10

spawn ssh [email protected]

expect "*Password*"

send "密码\r"

expect ">"

send "ls;cd back/rate/;run.sh\r"

expect eof

热点内容
服务器怎么证明是好的 发布:2024-05-17 18:39:28 浏览:682
树莓派如何搭建mqtt服务器 发布:2024-05-17 18:27:38 浏览:436
门口机sip服务器ip是什么 发布:2024-05-17 17:38:27 浏览:553
光遇安卓区是什么服 发布:2024-05-17 17:22:25 浏览:24
linux驱动开发教程 发布:2024-05-17 17:19:52 浏览:501
抖音中秋节视频脚本 发布:2024-05-17 17:19:51 浏览:194
快递柜为什么用安卓系统 发布:2024-05-17 17:17:18 浏览:907
电脑配置光纤接口怎么标注 发布:2024-05-17 17:06:56 浏览:977
如何用方向键控制安卓机 发布:2024-05-17 16:38:11 浏览:199
雨田系统源码 发布:2024-05-17 16:28:06 浏览:587