小编Jol*_*lta的帖子

Bash脚本:无法正确处理SIGTSTP

我有一个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信号发送到进程.知道为什么会发生这种情况以及如何解决这个问题吗?

linux bash signals bash-trap

9
推荐指数
1
解决办法
1679
查看次数

同时在Bourne shell中监视信号和进程退出

我有一个想要监视另一个程序的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)

鉴于我的目标是同时等待另一个进程退出并能够响应信号,是否有更好的解决方案?

signals sh wait shell-trap

8
推荐指数
1
解决办法
740
查看次数

配置getByName在将POM文件发布到Artifactory时无法在gradle中工作

我在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名称一起存储.

有谁知道新的"名字"应该是什么?

谢谢.

android artifactory build.gradle

8
推荐指数
1
解决办法
782
查看次数

从陷阱处理程序中获取bash中的函数回溯(使用调用者)

我知道你可以使用'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'而不是失败命令的行号

error-handling bash bash-trap

7
推荐指数
1
解决办法
1838
查看次数

bash使用陷阱SIGCHLD重启子进程?

我已经看过监视程序,无论是在脚本中,使用'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脚本启动只是睡了几秒钟然后退出.

观察到几个问题:

  • 当shell在前台启动时,SIGCHLD只会被处理一次.陷阱复位信号处理如signal()?
  • 脚本及其子代似乎不受SIGINT的影响,这意味着它们不能被^ C阻止
  • 由于无法关闭,我关闭了终端.脚本似乎是HUP,许多僵尸孩子离开了.
  • 在后台运行时,脚本导致终端死机

......无论如何,这根本不起作用.我不得不说我对这个话题知之甚少.有人可以建议或提供一些有用的例子吗?是否有这样的脚本?

那么在bash中使用等待怎么样?

谢谢

bash child-process sigchld bash-trap

7
推荐指数
1
解决办法
6541
查看次数

Powershell陷阱[Exception]没有捕获我的错误

出于某种原因,当我针对不存在的文件运行以下脚本时,我的脚本没有捕获异常.我基于我在网络上找到的示例来创建此代码,但它似乎对我不起作用.

我将不胜感激如何解决这个问题的任何提示或指示.

注意:在下面的例子中我也试过了

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)

powershell exception-handling exception powershell-trap

7
推荐指数
1
解决办法
1万
查看次数

定义MIB并在.net下发送SNMP陷阱

我已经为C#中的.net公司开发了一个特殊的应用程序,它已经使用多年了.现在它开发了,我必须实现的一个主要新功能是通过在某些警报情况下向其发送SNMP陷阱来将其与另一个软件集成.

我是一名经验丰富的开发人员,但我从未使用过SNMP.我搜索了一整天,但对这个话题越来越困惑.我没有明确的"起点".我理解SNMP的基础知识,但我不知道在哪里以及如何开始实现.

我有通过SNMP陷阱发送的数据,它有10个属性,一些日期,数字和字符串.我应该在这个属性上创建MIB定义.稍后我应该在我的应用程序中实现一个基于此MIB发送SNMP陷阱的功能.

该项目是在c#的.net 4下开发的.我发现这个库看起来很有希望:http://sharpsnmplib.codeplex.com/ 它有一些关于发送SNMP陷阱的示例.

我的问题是:从哪里开始?如何定义MIB文件?我知道他们是一些必须编译的文本文件,但没有找到任何MIB编辑器和帮助这个主题.

任何帮助表示赞赏!

谢谢!

.net snmp mib sharp-snmp snmp-trap

7
推荐指数
1
解决办法
1万
查看次数

cp:找不到命令

我试图将一个文件复制到其他目录,并在调用中断时收到错误消息.

剧本 :

#!/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)

你知道这个剧本有什么问题吗?

linux bash signals cp bash-trap

7
推荐指数
2
解决办法
1万
查看次数

收到SIGINT或SIGTERM时是否需要执行trap EXIT?

我有一个简单的脚本

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)

所以我不确定它应该如何操作以及它是否被指定.

error-handling shell signals shell-trap

7
推荐指数
1
解决办法
1045
查看次数

检查是否在Bash中设置了陷阱

有没有办法检查trapBash中已设置的内容(在当前会话或脚本中)?

理想情况下,我希望能够获得trap分配给它们的信号列表,但如果不可能,我可以单独检查每个信号.

linux bash shell signals bash-trap

6
推荐指数
2
解决办法
1274
查看次数