如果在我的C#应用程序中,我正在创建一个可以正常终止或者开始行为不端的子进程,在这种情况下我通过调用Process.Kill()来终止它.但是,我想知道进程是否已经退出通常.我知道我可以获得已终止进程的错误代码,但是什么是正常的退出代码以及什么意味着该进程被杀死了?
我正在编写一个生成C代码的编译器.生成的程序只包含main函数,它们使用大量内存,用malloc()分配.分配的大部分内存仅用于程序的一小部分,我认为在使用后释放它是个好主意,因为它不会再被使用.我很高兴,如果valgrind会向我报告在程序结束时内存不是free()d,即仍然可以访问的内存.我在Makefile中使用带有--error-exitcode = 1的valgrind来自动检查这种问题.
问题是:有没有办法让valgrind退出1,以防仍有可达的分配?
我有多个项目的解决方案。仅当两个事件在预构建事件中都退出且错误代码为0时,才需要构建一个项目。
所以我认为我可以做以下事情:
“ C:\ Path \ To \ Binary1.exe”和“ C:\ path \ to \ binary2.exe”
在我的测试方案中,出现了问题,因此Binary1.exe退出并带有非零值。但是Visual Studio还是继续构建项目。当我在cmd中运行构建前事件命令行并回显%errorlevel%时,我看到退出代码为非零。
当我只放
“ C:\ Path \ To \ Binary1.exe”
在预构建事件中,构建停止,并且在Error ListVisual Studio窗口中显示错误。
我可以肯定Binary1.exe会以非零值退出,因为它在退出前还会显示一个消息框。
我可以想到一种解决方案。Binary1.exe调用Binary2.exe并以非零退出代码退出,而Binary2.exe以非零退出代码退出。但这并不是一个灵活的解决方案。
总结一下: 当其中一个命令返回非零值时,如何运行多个预构建事件并停止构建?
我在检查多管道命令链中的某个命令是否确实抛出错误时遇到问题.通常这不难检查,但在我的情况下既不set -o pipefail检查也不检查${PIPESTATUS[@]}.设置如下:
cmd="$snmpcmd $snmpargs $agent $oid | grep <grepoptions> for_stuff | cut -d',' f$fields | sed 's/ubstitute/some_other_stuff/g'"
Run Code Online (Sandbox Code Playgroud)
注1:该命令经过彻底测试,运行良好.
现在,我想将该命令的输出存储在一个名为的数组中procdata.因此,我做了:
declare -a procdata
procdata=( $(eval $cmd) )
Run Code Online (Sandbox Code Playgroud)
注2:eval是必要的,因为否则$snmpcmd会抛出一个invalid option -- <grepoption>没有意义的错误,因为显然<grepoption>不是一个$snmpcmd选项.在这个阶段,我认为这是一个错误,$snmpcmd但这是另一个节目......
如果发生错误,则为procdata空.但是,由于两个不同的原因,它可能是空的:要么是因为执行$snmpcmd(例如超时)时发生错误,要么是因为grep无法找到它要查找的内容.问题是,我需要能够区分这两种情况并单独处理它们.
因此,set -o pipefail不是一个选项,因为它会传播任何错误,我无法区分管道的哪个部分失败.另一方面,即使我有很多管道,echo ${PIPESTATUS[@]}总是会0在之后procdata=( $(eval $cmd) )!然而,如果我在提示符处直接执行整个命令并echo ${PIPESTATUS[@]}在之后立即调用,则会正确返回所有管道的退出状态.
我知道我可以将错误的流绑定到stdout但我必须使用启发式方法来检查元素procdata是有效还是错误消息,并且我冒着得到误报的风险.我也可以管道stdout /dev/null并只捕获错误流并检查是否${#procdata[@]} …
我正在为我的公司编写安装程序,以便我们可以轻松设置新机器.其中一部分是通过各个perl -MCPAN -e 'install "Module::Name"'命令安装的一系列CPAN模块.我创建了一个模块数组(大约200个),它通过bash脚本中的foreach循环安装.但是,我现在想在启动新模块之前检查模块安装的退出状态,这可能吗?这是我到目前为止所尝试的:
for i in "${CPANmodules[@]}"
do
echo -e "\033[1;32mInstalling CPAN module $i \033[0m"
perl -MCPAN -e "install \"$i\""
if [ $? -ne 0 ]
then
echo "Error installing module $i"
fi
done
Run Code Online (Sandbox Code Playgroud)
我也试过以下,没有成功:
perl -MCPAN -e 'install "Madeup::Modulename"'
perl -e 'print $?'
Run Code Online (Sandbox Code Playgroud)
但是,即使模块甚至不存在,它也始终返回0.
任何帮助,将不胜感激.
#function运行shell命令
def OSinfo(runthis):
#Run the command in the OS
osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
#Grab the stdout
theInfo = osstdout.stdout.read() #readline()
#Remove the carriage return at the end of a 1 line result
theInfo = str(theInfo).strip()
#Return the result
return theInfo
Run Code Online (Sandbox Code Playgroud)
#flash raid固件
OSinfo('MegaCli -adpfwflash -f ' + imagefile + ' -noverchk -a0')
Run Code Online (Sandbox Code Playgroud)
#返回固件闪存状态
?
Run Code Online (Sandbox Code Playgroud)
一个资源建议使用'subprocess.check_output()',但是,我不知道如何将其合并到函数OSinfo()中.
是否有更好的方法从一行中获取命令的返回代码。例如:
$ test $(ls -l) ||echo 'ok'
-bash: test: too many arguments
ok
Run Code Online (Sandbox Code Playgroud)
上面的脚本在test命令中有错误,因为它似乎解析输出“ ls-l”而不返回代码。
我知道使用“如果”语法可以正常工作,但是需要多一行。
ls -l
if [ $? -eq 0 ];then
echo 'ok'
fi
Run Code Online (Sandbox Code Playgroud) 我正在编写一个spark应用程序并使用spark-submit shell脚本运行它(使用yarn-cluster/yarn-client)
正如我现在看到的,spark-submit的退出代码是根据相关的纱线应用决定的 - 如果SUCCEEDED状态为0,否则为1.
我想要选择返回另一个退出代码 - 对于我的应用程序成功发生一些错误的状态.
可能吗?从应用程序返回不同的退出代码?
我试过使用System.exit()但没有成功......
谢谢.
我写了一个脚本来启动一些并行运行的进程(简单单元测试).它会做N与工作num_workers同时并行处理.
我的第一个实现分批运行流程,num_workers似乎工作正常(我在false这里使用命令来测试行为)
import subprocess
errors = 0
num_workers = 10
N = 100
i = 0
while i < N:
processes = []
for j in range(i, min(i+num_workers, N)):
p = subprocess.Popen(['false'])
processes.append(p)
[p.wait() for p in processes]
exit_codes = [p.returncode for p in processes]
errors += sum(int(e != 0) for e in exit_codes)
i += num_workers
print(f"There were {errors}/{N} errors")
Run Code Online (Sandbox Code Playgroud)
但是,测试不会花费相同的时间,所以我有时候会等待慢速测试才能完成.因此,我重写了它,以便在完成任务时继续分配任务
import subprocess
import os
errors = 0
num_workers = 40 …Run Code Online (Sandbox Code Playgroud) exit-code ×10
bash ×2
python ×2
subprocess ×2
apache-spark ×1
c ×1
c# ×1
cpan ×1
events ×1
exit ×1
free ×1
gitlab ×1
hadoop-yarn ×1
kill-process ×1
perl ×1
pipe ×1
return-value ×1
shell ×1
snmp ×1
spark-submit ×1
valgrind ×1