什么情况下退出整个shell程序

什么情况下退出整个shell程序,第1张

使用trap和kill退出整个脚本

cat >testsh<<EOF''

#!/bin/bash

export TOP_PID=$$

trap 'exit 1' TERM

exit_script(){

kill -s TERM $TOP_PID

}

echo "before exit"

:|exit_script

echo "after exit"

EOF

chmod a+x testsh

/testsh

echo $

# 输出

before exit

1

这里首先在脚本的主进程中捕获(trap) TERM信号: 当主进程接收到TERM信号后,会执行exit 1;再在Sub-Shell中向脚本主进程发送TERM信号,这样就可以让整个脚本退出了!

正常。当你退出命令程序后,shell也终止了,因此是不显示的。计算机程序又称“计算机软件”。通过指令的顺序,使计算机能按所要求的功能进行精确记述的逻辑方法。计算机本身作为机器可以获得专利,但计算机程序是一种数学逻辑方法,各国不予保护。

程序是编写后的文件,进程是运行中的程序,既然运行shell程序了,它在系统里就是正在运行的了(进程,拥有pid),执行完毕、达到退出条件了,自然就推出了,或者是不退出的,监视系统的程序,全看编写的人的意愿。

另开一个终端,ps查看testpy的进程号,然后kill -9杀死该进程。

或直接退出当前运行终端。

追问:

请教,为什么其他一些程序在shell中用命令跑起来后,可以用ctrl+C终止,而python不行?

追答:

ctrl+C其实是发送SIGTERM的信号,而SIGTERM信号可以被用户态的进程所截获并且可以由用户去控制收到信号后的处理(如直接忽视,直接忽视就像你看到的,进程不会退出)。

如果对这方面感兴趣,可以看看LINUX的信号机制。

请采纳。

'首先你先生成一个xxexe

'在工程里添加一个time,生成101exe

'把101exe和xxexe放在一个文件里,运行即可

'-------------------复制代码即可(101exe的代码)---------------------

Const TH32CS_SNAPHEAPLIST = &H1

Const TH32CS_SNAPPROCESS = &H2

Const TH32CS_SNAPTHREAD = &H4

Const TH32CS_SNAPMODULE = &H8

Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)

Const TH32CS_INHERIT = &H80000000

Const MAX_PATH As Integer = 260

Private Type PROCESSENTRY32

dwSize As Long

cntUsage As Long

th32ProcessID As Long

th32DefaultHeapID As Long

th32ModuleID As Long

cntThreads As Long

th32ParentProcessID As Long

pcPriClassBase As Long

dwFlags As Long

szExeFile As String MAX_PATH

End Type

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long

Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long

Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long

Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Function exitproc(ByVal exefile As String) As Boolean

exitproc = False

Dim hSnapShot As Long, uProcess As PROCESSENTRY32

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)

uProcessdwSize = Len(uProcess)

r = Process32First(hSnapShot, uProcess)

Do While r

If Left$(uProcessszExeFile, IIf(InStr(1, uProcessszExeFile, Chr$(0)) > 0, InStr(1, uProcessszExeFile, Chr$(0)) - 1, 0)) = exefile Then

exitproc = True

Exit Do

End If

r = Process32Next(hSnapShot, uProcess)

Loop

End Function

Private Sub Form_Load()

Shell "Rundll32exe urldll, FileProtocolHandler xxexe", vbHide '这个是调用程序的

Timer1Interval = 100

End Sub

Private Sub Timer1_Timer()

Dim a

a = exitproc("xxexe")

If a = 0 Then '检测进程不存在则此程序结束

End

End If

End Sub

放到后台去执行,前台已经不管其执行情况了,返回的仅仅是放入后台这个 *** 作成功与否而非命令本身,那肯定都是成功的。

后台获取ls -l 命令的执行情况,可以考虑将错误输出流(2)导入标准输出(1)获取命令打印结果加以判断。如:

ret=`ls -l my 2>&1 &`

# 如果是用脚本执行的话,需要在这里判断进程是否存在,等待命令执行完;或者sleep足够长的时间

echo $ret | grep "No such file or directory" >/dev/null 2>&1

if [ $ -eq 0 ]; then

echo "Failed"

else

echo "Successful"

fi

或者也可以考虑写文件的方式,若后台命令执行发生错误,写错误日志,判断存在错误日志且大小不为0,就能知道命令执行发生错误了。这样做的好处是,不涉及具体错误信息的判断。

errlog=/tmp/errlog

size=0

ls -l my 2>$errlog &

# 如果是用脚本执行的话,需要在这里判断进程是否存在,等待命令执行完;或者sleep足够长的时间

[ -f $errlog ] && size=`wc -c $errlog | cut -d' ' -f1`

if [ $size -gt 0 ]; then

echo "Failed"

else

echo "Successful"

fi

#!/bin/sh

while true;

do

read -s -n1 -p "Press Y to exit "

if test $REPLY = 'Y';

then echo; exit;

else echo ;

fi

done

以上就是关于什么情况下退出整个shell程序全部的内容,包括:什么情况下退出整个shell程序、退出交互式命令行程序后shell不显示输入、进程导致shell退出是怎么回事等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9528404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存