system命令

首先我们看一个例子:

    status = system("./test.sh");  


1、先统一两个说法:
(1)system返回值:指调用system函数后的返回值,比如上例中status为system返回值
(2)shell返回值:指system所调用的shell命令的返回值,比如上例中,test.sh中返回的值为shell返回值。

2、如何正确判断test.sh是否正确执行?
仅判断status是否==0?或者仅判断status是否!=-1? 

都错!

3、man中对于system的说明

RETURN VALUE
       The value returned is -1 on error (e.g.  fork() failed), and the return
       status  of  the command otherwise.  This latter return status is in the
       format specified in wait(2).  Thus, the exit code of the  command  will
       be  WEXITSTATUS(status).   In  case  /bin/sh could not be executed, the
       exit status will be that of a command that does exit(127).
看得很晕吧?

system函数对返回值的处理,涉及3个阶段:
阶段1:创建子进程等准备工作。如果失败,返回-1。
阶段2:调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1),
             原因值被写入到status的低8~15比特位中。system的man中只说明了会写了127这个值,
             但实测发现还会写126等值。
阶段3:如果shell脚本正常执行结束,将shell返回值填到status的低8~15比特位中。
备注1:
只要能够调用到/bin/sh,并且执行shell过程中没有被其他信号异常中断,都算正常结束。
比如:不管shell脚本中返回什么原因值,是0还是非0,都算正常执行结束。
即使shell脚本不存在或没有执行权限,也都算正常执行结束。
如果shell脚本执行过程中被强制kill掉等情况则算异常结束。

如何判断阶段2中,shell脚本是否正常执行结束呢?系统提供了宏:
WIFEXITED(status)。如果WIFEXITED(status)为真,则说明正常结束。

如何取得阶段3中的shell返回值?你可以直接通过右移8bit来实现,
但安全的做法是使用系统提供的宏:WEXITSTATUS(status)。


由于我们一般在shell脚本中会通过返回值判断本脚本是否正常执行,如果成功返回0,失败返回正数。
所以综上,判断一个system函数调用shell脚本是否正常结束的方法应该是如下3个条件同时成立:
(1)-1 != status
(2)WIFEXITED(status)为真
(3)0 == WEXITSTATUS(status)

注意:
根据以上分析,当shell脚本不存在、没有执行权限等场景下时,以上前2个条件仍会成立,
此时WEXITSTATUS(status)为127,126等数值。
所以,我们在shell脚本中不能将127,126等数值定义为返回值,否则无法区分中是shell的返回值,

 

还是调用shell脚本异常的原因值。shell脚本中的返回值最好多1开始递增。

 

 

***********************************************************************************************************************

以上为个人转载,得出以下函数:

int System_Check(int result)
{
    if((-1 != result) && (WIFEXITED(result)) && (!(WEXITSTATUS(result))))
        return 0;
    else
        return -1;
}

使用形式:

int result =0;

result = system(cmd);

if(!System_Check(result))

    ****成功****

else

    ****失败****

 

这个判断标准在绝大多数情况下,成立!也有不满足的情况,例如:

使用system函数执行:diff file1 file2 命令,如果两个文件有差异,该命令执行成功。

而返回result不符合上述检测。

<think>好的,用户想了解Docker system命令的使用指南。首先,我需要回忆一下Docker system相关的命令,以及用户可能关心的方面。根据之前的引用,用户提到了几个关键命令,比如docker version、docker info、docker system df和docker system prune。这些应该是重点。 首先,我应该分清楚每个子命令的作用。例如,docker system df用于查看磁盘使用情况,而docker system prune用于清理不需要的数据。用户可能想知道每个命令的具体用法和参数,比如如何强制删除或者过滤某些资源。 接下来,用户可能还关心这些命令的实际应用场景,比如在什么情况下需要清理磁盘,或者如何监控Docker的资源占用。此外,注意事项也很重要,比如prune命令的风险,避免误删重要数据。 然后,我需要检查是否有其他相关的system命令,比如是否有docker system events或者docker system info之类的,但根据引用内容,主要的是df和prune。确保覆盖这些,同时可能补充一些常用参数,比如--all、--volumes等。 还要考虑用户可能的后续问题,比如如何自动化清理,或者如何结合其他命令进行资源管理。但当前主要任务是给出基本的使用指南,结构清晰,分点说明每个命令的用途、语法和示例。 另外,引用中的示例代码需要正确格式化,比如使用代码块,并且按照用户的要求,行内公式用$...$,独立公式用$$...$$,不过Docker命令可能不涉及数学公式,但需要注意语法正确性。 最后,生成相关问题时要围绕Docker system命令的扩展,比如优化磁盘空间、监控资源、与其他命令的区别等。确保问题有针对性,帮助用户深入理解。</think>### Docker system 命令使用指南 Docker system 命令是用于管理系统级资源的核心工具,涵盖磁盘监控、数据清理和系统信息查看等功能。以下是常用子命令的详细说明: --- #### 1. **查看磁盘使用情况:`docker system df`** - **功能**:统计镜像、容器、卷和缓存占用的磁盘空间。 - **语法**: ```bash docker system df ``` - **输出示例**: ``` TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 3 2.1GB 800MB (38%) Containers 3 1 120MB 120MB (100%) Local Volumes 2 1 500MB 200MB (40%) Build Cache 0 0 0B 0B ``` - **参数扩展**: - `-v`:显示详细信息(如具体资源名称)。 --- #### 2. **清理未使用数据:`docker system prune`** - **功能**:删除未使用的镜像、容器、卷和网络,释放磁盘空间。 - **基础语法**: ```bash docker system prune ``` - **常用参数**: - `-a`:清理所有未使用的镜像(包括未被容器引用的镜像)。 - `--volumes`:同时删除未关联的卷(需谨慎使用)[^3]。 - `-f`:强制清理,无需确认。 - **示例**: ```bash # 清理所有未使用的资源(包含镜像和卷) docker system prune -a --volumes ``` --- #### 3. **查看系统信息:`docker system info`** - **功能**:显示 Docker 守护进程的全局配置及资源状态(如容器数、镜像数、存储驱动类型等)[^1]。 - **语法**: ```bash docker system info ``` - **关键信息**: - 容器和镜像总数 - 存储驱动(如 `overlay2`) - 内存/CPU 限制配置 - 网络类型 --- #### 4. **其他相关命令** - **`docker version`**:查看客户端和服务端版本信息[^1]。 ```bash docker version ``` - **`docker stats`**:实时监控容器资源占用(CPU、内存、网络等)。 ```bash docker stats [容器名称] ``` --- ### 使用场景与注意事项 1. **磁盘空间不足时**:优先使用 `docker system df` 分析占用,再通过 `prune` 清理。 2. **定期维护**:建议结合定时任务清理无用资源,例如每周执行一次 `prune`。 3. **风险规避**: - 清理卷时需确保数据已备份(`--volumes` 参数会删除未关联的卷)[^3]。 - 生产环境中避免直接使用 `-f` 强制删除,防止误操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值