书接上文,我们来看一下退出状态码,退出状态码在我们的shell脚本中用的也是比较多的,我们会给大家讲一个退出状态码最常用的场景。首先我们来看一下什么是退出状态码。

  • 所有的shell命令都使用 退出状态码 来告知shell它已经执行完毕。
  • 退出状态码是一个 0~255 的整数值
  • Linux提供了一个$?来捕获退出状态码的值

另外,它的退出状态码不同,也代表它的执行结果的不同。我们来看一下退出状态码它有多少?它可能是0~255中的一个整数值。Linux提供了一个$?来捕获退出状态码的值。比如说我们在Linux系统中执行了一些命令,例如ls这样一个命令,这个命令是我们系统已经存在的命令,这个命令执行完之后可以列出当前目录下的文件,这时他成功执行后会返回系统一个0~255之间的整数退出状态码。这时我们通过$?可以获取到上一条命令执行完成之后返回的退出状态码是多少。接下来我们来看退出状态码代表的含义。

我们学习shell编程需要了解这些状态吗,但是没必要把这些状态码都背下来。在实际的工作场景中只需要记住两个就行了,0代表上一条命令成功执行,非0的都代表执行不成功。

接下来给大家演示一下。

我们首先执行以下命令来列出/etc下的所有文件:

ls /etc/

接下来执行:

echo $?

这样就可以获取到上一条命令ls /etc/执行之后返回的退出状态码。0代表上一条命令执行成功。

假如我们随便输入一些shell不存在的执行:

会看到退出状态码会变成127,说明它执行失败。

对于这个退出状态码我们在哪种情况下可以用到呢?例如:

#!/bin/bash
if [ $? -eq 0 ];then
        echo "success..."
        echo "failed"

        首先简要讲解一下脚本是什么意思,if语句后面会讲到,大家可以先忽略。

        data是我们首先执行的一条命令,我们知道date命令在我们的系统中是实际存在的,可以列出我们系统的时间,下面我们写一个if条件判断,如果中括号中条件满足的话我们就输出success...;不满足就输出failed。大家看中间的条件,大家知道$?是代表上一条date命令执行完之后的退出状态码,表示我们的date命令是否成功执行。-eq是固定写法,是equal(等于)的意思。表示如果退出状态码和0相等的话,代表上一条命令成功执行。

        我们来执行看一下。

sh exitCode.sh 

        可以看到首先把时间列出来然后输出success...

        在看一下另外的一个应用场景

#!/bin/bash
ps -ef | grep nginx
if [ $? -eq 0 ];then
        echo "success..."
        echo "failed"

        我们先将ps -ef | grep nginx这个命令在shell中执行一下

        大家可以看到我是grep不到任何nginx的进程。

        我来执行echo $? 它返回的是0。

        但是大家记住,当我们执行ps -ef | grep nginx这个命令的时候,它也会生成一个子进程,这个子进程也会包含nginx。所以它会在下面列出来。所以我们需要将它去掉。

        通过执行:

ps -ef | grep nginx | grep -v grep

         这样可以判断我们的nginx是否存在。这时它不会输出任何东西。我再输入echo $?,就会返回它的退出状态码为1。

        从而实现了监测我们的nginx进程是否存在。

        我再举一个其他的例子。

        比如说我们通过ps -ef | grep sshd来获取系统的sshd服务。

         然后执行:

ps -ef | grep "/usr/sbin/sshd" | grep -v grep

         可以看到是有结果的,说明这个进程是有的。

         这个当我们在脚本中做判断是有用的。好了,退出状态码就讲解到这里。如果各位有补充请留言,我验证之后完善文章。谢谢!

shell中运行的命令使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束时传给shell。可以捕获这个值并在脚本中使用。按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态码就是一个正数值。 [一] 查看退出状态码 echo $? 状态码及描述 0 :命令成功结束 1 : 一般性未知错误 2 :不适合的shell命令 126:命令不可执行 127:没找到命令 128:无效的退出参数 128+x:与Linux信号x 同样,脚本中的函数和脚本本身也会返回一个退出状态码。在脚本或脚本函数中最后一个执行的命令决定了函数的退出状态码值。命令的前一个命名执行的退出状态码Shell中的每一个命令都会使用一个退出状态码,其值范围是。该命令用来退出当前的脚步执行,并返回状态码。是在函数内部执行,则结束退出当前函数体的执行;把退出状态码传递给Shell。函数,用来正常终止一个进程,并会将并将。在C/C++语言中,系统库里提供了。在Shell脚本中,也提供了名为。脚本文件中执行,则结束当前的。,并且必须是一个整数。 我想在我的服务器上使用selenium构建我的爬虫.因此我在我的Ubuntu17.10服务器上安装/下载了所需的依赖项 - 例如chromedriver,chromium-browser等但是,当我运行以下代码时:driver = webdriver.Chrome()它返回以下错误:----------------------------------------------------------... Shell 中运行的命令会使用0-255之间的整数值,作为退出状态码,并以此来告知shell该命令执行的状态。通常情况下,约定0代表命令成功结束,非0代表程序非正常退出。典型退出状态码及其含义退出状态码含义0命令运行成功1通知未知错误2误用shell命令126命令不可执行127没有找到命令128无效退出参数128+xlinux信号x的严重错误130命令通过Ctrl+C终止255退出状态码... HiveServer Kill job的情况 1.Hive 发生主备切换时,新主主动kill掉原来的job; 2.在一个MR job中所有mappers及reducers创建HDFS文件数目超过文件最大数目时(该最大数目有HiveConf里的hive.exec.max.created.files控制,目前默认值为100,000); 3.当job提交失败时,HiveSer 在shell中运行的每个命令都使用了退出状态码告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令运行时由命令传给shell。可以捕获这个值并在脚本中使用。 查看退出状态码 Linux提供了一个专门的变量?来保存上个已执行的退出状态码。对于需要进行检查的命令,必须在运行完毕后立刻查看?来保存上个已执行的退出状态码。对于需要进行检查的命令,必须在运行完毕后立刻查看?来保存上... 在Linux状态中,每当命令执行完成后,系统都会返回一个退出状态。该退出状态用一个整数值表示,用于判断命令运行的正确与否。 最后一次执行命令的退出状态值被保存在内置变量“$?”中,所以,可以通过echo语句测试命令是否运行成功。 一般来讲,退出状态 0 表示正常执行,没有遭遇任何问题。其他非零的状态码均表示失败。 4)  停止进程,即暂停进程的执行; 5)  于之前的暂停之后恢复执行; 处理方式2和3都会导致进程终止执行立即退出,处理方式1、4、5不会造成进程终止执行。因此,可以将信号粗略的分为两类,一类是会导致进程终止并退出的信号;另一类则 对于 *NIX 系统而言,每一条命令,不管是内置的,SHELL 函数还是外置的,当它退出时,都 会返回一个小整数给引用它的程序,这就是程序退出状态 ( exit status ). 一般来讲,退出状态 0 表示正常执行,没有遭遇任何问题。其他非零的状态码均表示失败。 在 shell 中,可以使用 $? 来访问最后一个程序的退出状态。 下面是 POSIX 的结束状态:     shell命令的退出状态码都有特殊的意义,用来显示命令退出时的状态,更多地给外部使用.shell退出状态码是一个0~255之间的整数值.通常成功返回0,失败返回非0(错误码). 1. 一般的退出状态码含义: 命令成功结束 通用未知错误 误用Shell命令 命令不可执行 没找到命令 12... 僵尸进程是子进程运行结束,但因为没有被回收,所以一直占用资源,为了解决这个问题,引入了进程终止和进程等待。进程终止能让子进程在执行完任务以后,立马退出进程;进程等待让父进程停下来等待子进程执行完毕,然后回收子进程 在多进程编程中(这里讲Linux平台),某个进程函数退出时调用exit()函数。它是属于标准库的函数,原型void exit(int status);参数status是退出状态码,它可由用户自定义。为避免子进程成为僵尸进程,父进程是调用wait()或者waitpid()来获取子进程的退出状态。父进程的wait()(或者waitpid())结合子进程的exit()可以得到: 1) 子进程是否正常退出 RegistryUnavailable:连接不到镜像中心 ErrImagePull:通用的拉取镜像出错 CreateContainerConfigError:不能创建kubelet使用的容器配