使用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退出是怎么回事等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)