Exit codes 【关键语:linux 系统调用 exit(int status) 的退出值的说明 】
来源:互联网 发布:ise14.7 端口 编辑:程序博客网 时间:2024/05/18 05:22
原文地址:http://www.slac.stanford.edu/BFROOT/www/Computing/Environment/Tools/Batch/exitcode.html
————————————————————————————————————————————————————
Job crashes and exit codes
This webpage is a collection of information about job crashes and exit codes, gleaned from HyperNews and wherever else I could find it.
If you have anything useful to add, or if any of the information is incorrect, please feel free to edit the page!
Quick diagnosis
The overall impression I get from searching Hypernews is:
- If you get core dumped, there was a problem in your code, and you should use the debugger.
- If you do not get core dumped, then your exit code probably means you ran out of CPU time.
Exit codes and kill-job signals
The exit code from a batch job is a standard Unix termination status, the same sort of number you get in a shell script from checking the "$?
" variable after executing a command.
Typically, exit code 0 (zero) means successful completion.Codes 1-127 are typically generated by your job itself calling exit()
with a non-zero value to terminate itself and indicate an error. In BaBar we don't make very much use of this. The most common such value you might see is 64, which is the value used by Framework to say that its event loop is being stopped before all the requested data have been read, typically because time ran out. In recent BaBar releases you might also see 125, which we use as a code for a generic "severe error"; the job log should contain a message stating what the error was.
Exit codes in the range 129-255 represent jobs terminated by Unix "signals". Each type of signal has a number, and what's reported as the job exit code is the signal number plus 128. Signals can arise from within the process itself (as for SEGV, see below) or be sent to the process by some external agent (such as the batch control system, or your using the "bkill
" command).
By way of example, then, exit code 64 means that the job deliberately terminated its execution by calling "exit(64)
", exit code 137 means that the job received a signal 9, and exit code 140 represents signal 12.
The specific meaning of the signal numbers is platform-dependent. If you are trying to figure out a problem that was seen on Linux, you have to run the following commands on Linux. We don't have Solaris or Mac OS batch resources in BaBar at the moment, but if we did, you would have to match platforms similarly when debugging.
terminationDecoder
BaBar provides a little program that will take your exit code and spit out an explanation. The program is called terminationDecoder
. Examples:
[yakut] terminationDecoder 137terminated by signal 9 (Killed)[yakut] terminationDecoder 64exited with code 64 (in Framework: stop requested, e.g., by CpuCheck)
More details
You can also look this up yourself; if you know the signal number, then you can find out why the job was killed using the command "kill -l":
[yakut] kill -lHUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLTCHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYSRTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX
So for example, if your job was killed by signal 6, then it got an "ABRT", which is short for ABORT.
To find out what all the "kill -l
" words mean, you can use the command:
man 7 signal
(or, on Solaris, "man -s 3HEAD signal
"). This will give you the man page for SIGNAL(7). Scroll down a bit and you will get a list of the kill-signal words with a short explanation. Here is a sample:
SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling processSIGINT 2 Term Interrupt from keyboardSIGQUIT 3 Core Quit from keyboardSIGILL 4 Core Illegal InstructionSIGABRT 6 Core Abort signal from abort(3)SIGFPE 8 Core Floating point exceptionSIGKILL 9 Term Kill signalSIGSEGV 11 Core Invalid memory referenceSIGPIPE 13 Term Broken pipe: write to pipe with no readersSIGALRM 14 Term Timer signal from alarm(2)SIGTERM 15 Term Termination signal
(Obviously, these are just the "kill -l
" words, but with a "SIG" in front of them.)
You may also find it useful to look at the file signal.h. On a Linux machine, the location is:
/usr/include/asm/signal.h
Hypernews examples
Here are some specific exit codes that came up in Hypernews. Here I have recorded the HN responses. However, they might not be correct in all cases. (Maybe the exit codes can mean other things, too.)
Exit code 9: Ran out of CPU time.
Exit code 64: The framework ended the job nicely for you, most likely because the job was running out of CPU time. But it means you did not go through all the data requested. The solution is to submit the job to a queue with more resources (bigger CPU time limit).
Exit code 125: An ErrMsg(severe)
was reached in your job.
Exit code 127: Something wrong with the machine?
Exit code 130: The job ran out of CPU or swap time. If swap time is the culprit, check for memory leaks.
Exit code 131: The job ran out of CPU or swap time. If swap time is the culprit, check for memory leaks.
Exit code 134: The job is killed with an abort signal, and you probably got core dumped. Often this is caused either by an assert()
or an ErrMsg(fatal)
being hit in your job. There may be a run-time bug in your code. Use a debugger like gdb or dbx to find out what's wrong.
Exit code 137: The job was killed because it exceeded the time limit.
Exit code 139: Segmentatation violation.
Exit code 140: The job exceeded the "wall clock" time limit (as opposed to the CPU time limit).
HOWTO's guide to job-kill signals
The following is copied from HOWTO-Basic-Debugging, which you should definitely consult to learn how to interpret, report, and deal with errors and crashes:- SEGV
- A segmentation violation or segmentation fault typically means that something is trying to access memory that it shouldn't be accessing. One common example of this is trying to access memory through a NULL pointer, for example:
sunprompt> cat main.c#include main(){ int* bunk(0); cout << *bunk << endl;}sunprompt> CC main.csunprompt> ./a.outSegmentation fault (core dumped)
- ABRT
- asserts are one common source of the "abort" signal, for example:
sunprompt> cat main.c#include main(){ int i=0; assert(i!=0);}sunprompt> CC main.csunprompt> ./a.outAssertion failed: i!=0, file main.c, line 5Abort (core dumped)
Note that the actual assertion which was failed and the location is also printed. An ABRT can also be generated from the BaBarErrMsg(fatal)
construct, in which case your job log should contain a message explaining the error. - FPE
- A "Floating Point Error" usually indicates a numerical problem such as a division by zero or an overflow. One example would be:
osfprompt> cat main.cmain(){ float a = 1.; float b = 0.; float c = a/b;}osfprompt> g++ main.cosfprompt> ./a.outFloating exception (core dumped)
- ILL
- If you receive a signal like this ("Illegal Instruction"), means that, while running, your program has tried to execute a machine "instruction" which does not exist. This can happen for a variety of reasons, including:
- a memory overwrite that happens to overwrite part of the program stored in memory. This may result in the program trying, for example, to execute data as if it is a machine instruction.
- an attempt to take an executable compiled on one platform for use on another, for example on an earlier version of the same chip.
- a truncated or corrupted executable is loaded for execution
- incomplete recompilation of source code, i.e. you changed one C++ class and didn't recompile all other code affected by that change.
- BUS
- A "Bus Error" may come, for example, from accessing unaligned data (i.e. like trying to access a 4 byte integer with a pointer to the middle of it). What this means will vary from platform to platform. (I haven't come up with a good example of this one yet.)
A "Bus Error" can also often indicate a memory overwrite, e.g. somebody wrote a number where a pointer is kept. Often caused by going past the end of an array and into the system pointers at the start of the next memory block.
How do you know if you've exceeded your CPU time?
To find out whether your job has exceeded the CPU time limit, you have to do 3 things:
- Look at your log file to get the job's CPU time.
- Use the machine-dependent CPUF to convert the CPU time to SLAC time. The formula is: SLAC time = CPU time * CPUF.
- Compare this to the time allowed by the queue in which the job was run.
Here is an example.
First, look at the end of your log file:
Job <VubRecoilUserApp VubXlnu.tcl SP-1237-BSemiExcl-Run5-R18b-1 MC> was submitted from host <yakut02> by user <penguin>.Job was executed on host(s) <cob0313>, in queue <xlong>, as user <penguin>.</u/br/penguin> was used as the home directory.</u/br/penguin/vubrecoil/vub30/workdir> was used as the working directory.Started at Wed Feb 8 17:25:33 2006Results reported at Wed Feb 8 19:27:28 2006Your job looked like:------------------------------------------------------------# LSBATCH: User inputVubRecoilUserApp VubXlnu.tcl SP-1237-BSemiExcl-Run5-R18b-1 MC------------------------------------------------------------Exited with exit code 134.Resource usage summary: CPU time : 7058.71 sec. Max Memory : 2863 MB Max Swap : 2968 MB Max Processes : 3 Max Threads : 3
The job was run on the machine cob0313.
> bhosts -l cob0313
This tells you (among other things) that the CPUF for cob0313 is 7.65.
The SLAC time for your job is thus:
SLAC time = (CPU time) * CPUF = (7058.71 sec) * 7.65 = 53999.1 sec = 900 min
The next step to find out if this exceeds the CPU limit of the queue in which the job was run. In this example, the job was the xlong queue:
> bqueues -l xlong
Among other things, this tells you the CPU limit for the queue:
CPULIMIT 2900.0 min of slac
The job used only 900 minutes of SLAC time, less than the 2900 allowed by the xlong queue. So the job did not exceed its CPU time limit. It must have crashed for some other reason.
Memory Leaks
Jobs can also crash because of memory leaks --- things like dangling pointers or array overruns. The following links may be helpful for tracking down memory leaks:
- Memory leaks webpage
- Valgrind at BABAR
Author: Sheila Mclachlin
Created: Feb 09, 2006.
Last updated: Feb 13, 2006 by Gregory Dubois-Felsmann.
- Exit codes 【关键语:linux 系统调用 exit(int status) 的退出值的说明 】
- Unix / Linux 的程序退出状态 exit status---相关解释
- 结束JVM的方法,System.exit(int status)和Runtime类中的halt(int status)
- linux下exit系统调用
- Exit Codes
- linux 退出码 exit
- linux进程退出的时exit,_exit区别和联系
- Linux中进程正常退出return和exit()的区别
- Shell中的特殊变量$?-查看上一条Shell命令的退出状态码(exit status)
- Exit Status
- java System.getProperty(“ ”) System.exit(int status)
- linux下exit系统调用流程
- 进程的退出exit() --多进程编程
- 万能的退出函数exit VS ExitProcess
- 操作系统 — 进程的退出(exit)
- exit的不同值
- Linux exit --退出当前shell
- Exit Codes With Special Meanings (Linux)
- telnet与SSH服务
- PHP stdClass to Array and Array to stdClass – stdClass Object
- java判断文件编码
- android软键盘挡住输入框问题 完全解决
- 计时器:Chronometer
- Exit codes 【关键语:linux 系统调用 exit(int status) 的退出值的说明 】
- why WSGI
- soj 1239. Smallest Differencev
- apache问题you don't have permission to access / on this server如何解决
- RUDP & UDT
- android实现简单聊天室
- POJ1528 数论
- DownloadManager
- android手机操作数据库出现sqlite3 not found的解决方法