【发布时间】:2012-08-14 11:50:16
【问题描述】:
我有以下脚本:
tail -f nohup.out
echo 5
当我在 tail -f 上按 Ctrl+C 时,脚本停止运行:5 未打印。停止tail 命令后如何运行命令echo 5?
【问题讨论】:
我有以下脚本:
tail -f nohup.out
echo 5
当我在 tail -f 上按 Ctrl+C 时,脚本停止运行:5 未打印。停止tail 命令后如何运行命令echo 5?
【问题讨论】:
Ctrl+C 向前台process group 中的所有进程发送SIGINT 信号。当tail 运行时,进程组由tail 进程和运行脚本的shell 组成。
使用 trap 内置函数覆盖信号的默认行为。
trap " " INT
tail -f nohup.out
trap - INT
echo 5
陷阱的代码什么都不做,因此如果外壳程序收到 SIGINT,它会继续执行下一个命令 (echo 5)。请注意,第一行的引号之间有一个空格;任何不做任何事情的 shell 代码都会做,除了一个空字符串,这意味着完全忽略信号(不能使用它,因为它会导致 tail 也忽略信号)。第二次调用trap 会恢复默认行为,因此在第三行之后,Ctrl+C 将再次中断脚本。
【讨论】:
#!/bin/bash
trap "echo 5" SIGINT SIGTERM
tail -f nohup.out
【讨论】:
echo 5,而不是在 tail 由于其他原因存在时(因为文件不存在,或者因为 tail 被显式杀死)。您可以添加伪信号EXIT,但这不是一种非常易读的方式来指定echo 5 将在tail 之后执行。
您可以在新的 shell 中启动 tail,如下所示:
#!/bin/bash
bash -i -c 'tail -f nohup.out'
echo 5
【讨论】:
如 rwos 所述,但添加了内联陷阱。
bash -i -c "trap ' ' SIGINT; tail -F '$1'; trap - SIGINT"
在发出后续 SIGINT 信号时,这将在不关闭腻子会话的情况下工作(这是我的问题)
【讨论】:
在 bash 中以单个 & 符号结束该行,以异步方式在后台运行命令
tail -f nohup.out &
【讨论】:
在 perl 中查找 File:Tail,在不同的项目中使用过几次来自动跟踪日志并执行特定操作以输出日志。
google ftp-upload-mon 我上传到 sourceforge 的一个项目,它使用 File:Tail to tail -f xferlogs
【讨论】: