我有一个bash脚本,可以安装和卸载一个设备,在其间执行一些读取操作.由于设备非常慢,脚本需要大约15秒才能完成(安装至少需要5-6秒).由于安装此设备可能会导致其他问题,我不希望此脚本被中断.
话虽如此,我可以正确处理SIGINT(Ctrl + c),但是当我尝试处理SIGTSTP(Ctrl + z)时,脚本会冻结.这意味着信号被捕获但处理程序不运行.
#!/bin/sh
cleanup()
{
# Don't worry about unmounting yet. Just checking if trap works.
echo "Quitting..." > /dev/tty
exit 0
}
trap 'cleanup' SIGTSTP
...
Run Code Online (Sandbox Code Playgroud)
我手动必须将KILL信号发送到进程.知道为什么会发生这种情况以及如何解决这个问题吗?
我有一个想要监视另一个程序的Bourne shell(/ bin/sh)脚本(为了便携性).它应该启动另一个程序,然后等待它退出.当第二个程序退出时,它会做一些最后的工作并退出.问题在于脚本需要响应信号(例如USR2)并在这些信号出现时做一些工作.
我天真的实施是:
#! /bin/sh
echo $$
trap 'echo Respond to USR2' USR2
/bin/sleep 120 &
pid=$!
wait $pid
echo $pid exited with $?
echo Doing final cleanup
Run Code Online (Sandbox Code Playgroud)
这不起作用.如果我发送shell SIGUSR2,陷阱会按预期触发,但是等待也完成,返回140./bin/sleep继续它的快乐方式.典型输出:
28849
Respond to USR2
28850 exited with 140
Doing final cleanup
Run Code Online (Sandbox Code Playgroud)
这个行为在dash和bash之间是一致的,我可以方便地访问两个Bourne shell派生物.
我目前的工作是旋转循环等待子PID消失,用kill进行探测.自旋循环似乎很浪费,并且扩大了窗口,如果PID被快速重用,我的脚本可能会错误地等待错误的进程.
#! /bin/sh
echo $$
trap 'echo Respond to USR2' USR2
/bin/sleep 15 &
pid=$!
while /bin/kill -0 $pid 2> /dev/null; do
echo waiting...
sleep 2
done
echo Doing final cleanup
Run Code Online (Sandbox Code Playgroud)
鉴于我的目标是同时等待另一个进程退出并能够响应信号,是否有更好的解决方案?
我在build.gradle文件中使用发布部分将Android库发布到Artifactory:
publishing {
publications {
aar(MavenPublication) {
groupId packageName
version = libraryVersion
artifactId project.getName()
// Tell maven to prepare the generated "*.aar" file for publishing
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
pom.withXml {
def dependencies = asNode().appendNode('dependencies')
configurations.getByName("_releaseCompile").getResolvedConfiguration().getFirstLevelModuleDependencies().each {
def dependency = dependencies.appendNode('dependency')
dependency.appendNode('groupId', it.moduleGroup)
dependency.appendNode('artifactId', it.moduleName)
dependency.appendNode('version', it.moduleVersion)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它失败并出现以下错误:
Execution failed for task ':smartcardsdk:generatePomFileForAarPublication'.
> Could not apply withXml() to generated POM
> Configuration with name '_releaseCompile' not found.
Run Code Online (Sandbox Code Playgroud)
这对Android v2.x来说不是问题.我升级到Android Studio v3时出现了问题(我猜Gradle v3.0.0也是如此).
我猜测配置不再与_releaseCompile名称一起存储.
有谁知道新的"名字"应该是什么?
谢谢.
我知道你可以使用'caller'来获取bash函数调用的回溯:
#! /bin/bash
Backtrace () {
echo "Backtrace is:"
i=0
while caller $i
do
i=$((i+1))
done
}
myFunc () {
Backtrace
}
myFunc
Run Code Online (Sandbox Code Playgroud)
打印:
Backtrace is:
11 myFunc ./test.sh
13 main ./test.sh
Run Code Online (Sandbox Code Playgroud)
我的问题是,假设我有一个脚本使用'set -e'来终止任何未经检查的失败.是否可以获取脚本失败的行号(及其调用者)
我天真地尝试过:陷阱'Backtrace'EXIT,但这给了我'1 main ./test.sh'而不是失败命令的行号
我已经看过监视程序,无论是在脚本中,使用'ps'或'服务状态(在Linux上)'定期检查进程状态,还是在C/C++中分析并等待进程...
我想知道是否有可能使用带有陷阱的bash并在收到SIGCLD时重新启动子进程?
我已经在RedHat Linux上测试了一个带有以下想法的基本套件(当然它没有用......)
#!/bin/bash
set -o monitor # can someone explain this? discussion on Internet say this is needed
trap startProcess SIGCHLD
startProcess() {
/path/to/another/bash/script.sh & # the one to restart
while [ 1 ]
do
sleep 60
done
}
startProcess
Run Code Online (Sandbox Code Playgroud)
什么bash脚本启动只是睡了几秒钟然后退出.
观察到几个问题:
......无论如何,这根本不起作用.我不得不说我对这个话题知之甚少.有人可以建议或提供一些有用的例子吗?是否有这样的脚本?
那么在bash中使用等待怎么样?
谢谢
出于某种原因,当我针对不存在的文件运行以下脚本时,我的脚本没有捕获异常.我基于我在网络上找到的示例来创建此代码,但它似乎对我不起作用.
我将不胜感激如何解决这个问题的任何提示或指示.
注意:在下面的例子中我也试过了
trap [Exception] {
Run Code Online (Sandbox Code Playgroud)
但那也不起作用.
这是脚本:
function CheckFile($f) {
trap {
write-host "file not found, skipping".
continue
}
$modtime = (Get-ItemProperty $f).LastWriteTime
write-host "if file not found then shouldn't see this"
}
write-host "checking a file that does not exist"
CheckFile("C:\NotAFile")
write-host "done."
Run Code Online (Sandbox Code Playgroud)
输出:
PS > .\testexception.ps1
checking a file that does not exist
Get-ItemProperty : Cannot find path 'C:\NotAFile' because it does not exist.
At C:\Users\dleclair\Documents\Visual Studio 2010\lib\testexception.ps1:12 char:35
+ $modtime = (Get-ItemProperty <<<< $f).LastWriteTime
+ CategoryInfo …
Run Code Online (Sandbox Code Playgroud) 我已经为C#中的.net公司开发了一个特殊的应用程序,它已经使用多年了.现在它开发了,我必须实现的一个主要新功能是通过在某些警报情况下向其发送SNMP陷阱来将其与另一个软件集成.
我是一名经验丰富的开发人员,但我从未使用过SNMP.我搜索了一整天,但对这个话题越来越困惑.我没有明确的"起点".我理解SNMP的基础知识,但我不知道在哪里以及如何开始实现.
我有通过SNMP陷阱发送的数据,它有10个属性,一些日期,数字和字符串.我应该在这个属性上创建MIB定义.稍后我应该在我的应用程序中实现一个基于此MIB发送SNMP陷阱的功能.
该项目是在c#的.net 4下开发的.我发现这个库看起来很有希望:http://sharpsnmplib.codeplex.com/ 它有一些关于发送SNMP陷阱的示例.
我的问题是:从哪里开始?如何定义MIB文件?我知道他们是一些必须编译的文本文件,但没有找到任何MIB编辑器和帮助这个主题.
任何帮助表示赞赏!
谢谢!
我试图将一个文件复制到其他目录,并在调用中断时收到错误消息.
剧本 :
#!/bin/bash
PATH=~/MkFile/
exitfn () {
trap SIGINT # Resore signal handling for SIGINT
echo ; echo 'Called ctrl + c ' # Growl at user,
cp ./BKP/temp.txt $PATH/backup.txt
exit # then exit script.
}
trap "exitfn" INT # Set up SIGINT trap to call function.ii
read -p "What? "
echo "You said: $REPLY"
# reset all traps##
trap - 0 SIGINT
Run Code Online (Sandbox Code Playgroud)
输出:
./signal.sh
What? ^C
Called ctrl + c
./signal.sh: line 9: cp: command not found
Run Code Online (Sandbox Code Playgroud)
你知道这个剧本有什么问题吗?
我有一个简单的脚本
trap 'echo exit' EXIT
while true; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
并且它在不同的shell中表现不同:
$ bash tst.sh
^Cexit
$ dash tst.sh
^C
$ zsh tst.sh
^C
$ sh tst.sh
^Cexit
Run Code Online (Sandbox Code Playgroud)
所以我不确定它应该如何操作以及它是否被指定.
有没有办法检查trap
Bash中已设置的内容(在当前会话或脚本中)?
理想情况下,我希望能够获得trap
分配给它们的信号列表,但如果不可能,我可以单独检查每个信号.
bash ×5
bash-trap ×5
signals ×5
linux ×3
shell ×2
shell-trap ×2
.net ×1
android ×1
artifactory ×1
build.gradle ×1
cp ×1
exception ×1
mib ×1
powershell ×1
sh ×1
sharp-snmp ×1
sigchld ×1
snmp ×1
snmp-trap ×1
wait ×1