我可以编写可以很好地捕获的 shell 脚本SIGINT
,但我似乎无法捕获SIGQUIT
.
#!/bin/bash
function die {
echo "Dying on signal $1"
exit 0
}
trap 'die "SIGINT"' SIGINT
trap 'die "SIGQUIT"' SIGQUIT
while true; do
echo "sleeping..."
sleep 5
done
Run Code Online (Sandbox Code Playgroud)
执行此脚本并按下CTRL-C
具有所需的效果,但是按下CTRL-\
(据我所知,应该触发)除了在终端中SIGQUIT
打印之外没有任何作用。^\
为什么?
我有两个运行理论。首先,SIGINT
和 的语义SIGQUIT
不同,SIGQUIT
仅发送到子进程sleep
,而同时SIGINT
发送到子进程和父 bash 进程。如果是这种情况,它在哪里记录?
我的第二个理论是 bash 不仅默认忽略(即有一个无操作处理程序)SIGQUIT
(如手册页所示),而且根本不允许它被捕获。该理论与第一个理论重叠,因为父级和子级都可能出现这种情况SIGQUIT
,但父级 ( bash
) 无法捕获它。如果是这种情况,有什么方法可以捕获SIGQUIT
bash 脚本吗?...也许shopt
我可以设置一些?
编辑:这是在 Ubuntu 10.10 上的 …
我正在为应用程序编写一个bash包装器.该包装器负责更改用户,运行软件和记录其输出.我也希望它传播SIGINT信号.
到目前为止,这是我的代码:
#!/bin/bash
set -e; set -u
function child_of {
ps --ppid $1 -o "pid" --no-headers | head -n1
}
function handle_int {
echo "Received SIGINT"
kill -int $(child_of $SU_PID)
}
su myuser -p -c "bash /opt/loop.sh 2>&1 | tee -i >(logger -t mytag)" &
SU_PID=$!
trap "handle_int" SIGINT
wait $SU_PID
echo "This is the end."
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我向这个包装器发送一个SIGINT时,handle_int
会被调用但是脚本结束了,而我希望它继续等待$SU_PID
.
有没有办法捕获int信号,做一些事情,然后阻止脚本终止?
嗨,什么是检查SSH是否因任何原因失败的最佳方法?我可以使用IF语句(如果它失败的话做什么),我在一个循环中使用ssh命令和传递我的主机名形成一个平面文件.
所以我做了类似的事情:
for i in `cat /tmp/hosts` ; do ssh $i 'hostname;sudo ethtool eth1'; done
Run Code Online (Sandbox Code Playgroud)
我得到这个错误或我无法连接
ssh: host1 Temporary failure in name resolution
Run Code Online (Sandbox Code Playgroud)
我想跳过无法连接的主机是SSH失败.做这个的最好方式是什么?是否存在运行时错误,我可以陷阱绕过无论出于何种原因我无法进入的主机,也许ssh是不允许的,或者我没有正确的密码?
提前谢谢你干杯
我有需要加载到java并发程序的属性文件.路径的一部分由系统环境变量JAVA_TOP定义.当我给出它识别的完整路径时.否则它不会.我试着给文件路径
<JAVA_TOP>/abc....
$JAVA_TOP/abc...
JAVA_TOP/abc
Run Code Online (Sandbox Code Playgroud)
他们似乎都没有工作.请让我知道如何从java应用程序中读取环境变量JAVA_TOP.
对于 Bash 程序:
1 #!/bin/bash
2
3 trapinfo()
4 {
5 echo "=== Trap Info: Status=$? LINENO=$@ A=$A"
6 }
7
8 main()
9 {
10 trap 'trapinfo $LINENO -- ${BASH_LINENO[*]}' ERR
11
12 set -e
13 set -E
14 set -o errtrace
15 shopt -s extdebug
16
17 local -g A=1
18
19 # false # If uncommented, LINENO would be 19
20 (exit 73) # LINENO is 9. How can I get 20 instead?
21
22 A=2
23 …
Run Code Online (Sandbox Code Playgroud) 我尝试在RStudio中开始bookdown。我下载了 bookdown-minimal-master。加载后,我单击“构建书籍”按钮。然后我收到错误消息index.Rmd
Error in rmarkdown::render_site(encoding = "UTF-8") : No site generator found.
出了什么问题?
所以这就是我正在做的事情 - 我有一个ruby脚本,每分钟打印出信息.我还为陷阱设置了一个proc,这样当用户点击ctrl-c时,进程就会中止.代码看起来像这样:
switch = true
Signal.trap("SIGINT") do
switch = false
end
lastTime = Time.now
while switch do
if Time.now.min > lastTime.min then
puts "A minute has gone by!"
end
end
Run Code Online (Sandbox Code Playgroud)
现在代码本身是有效的并且运行良好,但它会做很多无用的工作,switch
尽可能经常地检查它的值.它耗尽了尽可能多的处理器(至少是一个核心的100%),所以它非常浪费.我怎样才能做类似的事情,每隔一段时间更新一次事件,而不浪费大量的周期?
所有帮助表示赞赏,并提前致谢!
我想尝试捕获信号 1 但失败
#!/bin/bash
# capture an interrupt # 0
trap 'echo "Exit 0 signal detected..."' 0
trap 'echo "Exit 1 signal detected..."' SIGHUP
# display something
echo "This is a checkpoint 1"
exit 1
echo "This is checkpoint 2"
# exit shell script with 0 signal
exit 0
Output--
kithokit@15:02:55 trunk (master) $ ./test.sh
This is a checkpoint 1
Exit 0 signal detected...
kithokit@15:03:44 trunk (master) $
Run Code Online (Sandbox Code Playgroud)
即使是退出1,它总是陷入陷阱0,有人知道如何解决这个问题吗?
谢谢
我正在尝试通过snmptrap发送陷阱时指定端口.只是为了测试我的SNMP接收器,我想向它发送陷阱,但我无法访问端口162.如何将陷阱发送到另一个端口?
在我看来,man-page没有描述这个选项.
(我不完全理解snmptrap消息的部分是什么,所以如果有人想解释它会很好)