Linux 如何在脚本中停止tail命令
我想做的是-开始使用自定义ssh客户端代码***捕获对日志文件的更改。一段时间后(不是固定值,是基于事件的),发出命令停止跟踪。这是我用来捕获日志文件最新更改的命令-Linux 如何在脚本中停止tail命令,linux,bash,unix,Linux,Bash,Unix,我想做的是-开始使用自定义ssh客户端代码***捕获对日志文件的更改。一段时间后(不是固定值,是基于事件的),发出命令停止跟踪。这是我用来捕获日志文件最新更改的命令-tail-f logfile.txt 我希望能够以类似于:q的东西结束它,我可以从脚本中发出它。我不想使用键盘命令,如ctrl+c ***自定义ssh客户端代码的伪代码(用oop语言编写) 我对日志文件所在的服务器没有写访问权限 我试过的- 我无法理解那里的解决方案(在帖子2中)。有人能解释一下解决方案或提出不同的方法吗 谢谢。在脚
tail-f logfile.txt
我希望能够以类似于:q
的东西结束它,我可以从脚本中发出它。我不想使用键盘命令,如ctrl+c
***自定义ssh客户端代码的伪代码(用oop语言编写)
我对日志文件所在的服务器没有写访问权限
我试过的-
我无法理解那里的解决方案(在帖子2中)。有人能解释一下解决方案或提出不同的方法吗
谢谢。在脚本中,您可以使用
$代码>变量
# run tail -f in background
tail -f /var/log/sample.log > out 2>&1 &
# process id of tail command
tailpid=$!
# wait for sometime
sleep 10
# now kill the tail process
kill $tailpid
$代码>扩展到最近执行的后台(异步)命令的进程ID。您所指的post#2执行以下操作:具有正确的答案
它说:
tail -f /etc/httpd/logs/access_log & # This starts tailing the file in background (see & at the end)
kill `ps | grep tail | awk '{print $1;}'` # This finds the process running above tail command and kills it
您可能希望根据需要引入sleep 100
或其他命令,否则,上述两个命令将导致在终止之前只跟踪一小部分时间。您可以在后台执行tail,同时将其输出重定向到另一个文件(例如/tmp/mylog
)并将进程的pid写入pid文件的某个位置(例如,~/mytail.pid
):
下一步,当您想要停止它时,只需执行:
kill `cat ~/mytail.pid`
然后,您可以看到在此期间收集的日志内容(稍后删除它也是一个好主意):
根据您对@psmears的评论,您可以使用CTRL+C
@psmears——当然。那也行。我要做的就是告诉unix跟踪一个文件,随时停止跟踪它,并在开始和结束跟踪之间获得输出。谢谢两天前,波拉特·萨格迪耶夫
因此,只需在ssh参数内启动命令即可
ssh username@remotehost tail -f /var/log/remotelog.txt | tee result.log
完成后,点击CTRL+C
在前面的命令中,我使用了tee
命令,以便在终端中查看新行并将它们存储到文件中
如果您希望它是可编写脚本的
您可以执行以下操作:
## store result to file
FILE=result.log
## launch tail remote log, and store result to result.log
ssh -n username@remote-host tail -f /path/to/remote.log > $FILE &
## store pid
SSHPID=$!
## wait for ":q" command
while [ "$cmd" != ":q" ]; do
echo -ne "\n$ "
read -n 2 cmd
done
## kill ssh when you've enough
kill $SSHPID
## read result
echo "the changes made to log file were\n"
cat $FILE
请注意,如果要分离启动脚本和停止脚本,只需将SSHPID存储在脚本中的一个文件中即可
echo $SSHPID > ~/.sshpid
并从第二个中检索它
SSHPID=`cat ~/.sshpid`
我使用了一些方法来解决tail-f
,使用。
等待具体输入:
我经常使用这个:
sed -une '
/DHCPOFFER/{
s/^\(.*\) [^ ]\+ dhcpd: DHCPOFFER on \([0-9.]\+\) to \([0-9a-f:]\+\) .*$/\1 \3 -> \2/p;
q;
}' < <(
tail -f /var/log/syslog
)
。。。然后从哪里开始:
echo >/tmp/holder
kill -USR2 $(</tmp/lockfile)
ssh root@remoteMachine '/bin/bash -c "kill -USR2 $(</tmp/lockfile)"'
将终止tail命令
锁定方式
#!/bin/bash
[ -e /tmp/lockfile ] && exit
echo $$ >/tmp/lockfile
[ $(</tmp/lockfile) -ne $$ ] && exit
cd /var/log
tail -f syslog &
export tPid=$!
trap "kill $tPid;rm /tmp/lockfile;exit 0" 12
wait $tPid
#/bin/bash
[-e/tmp/lockfile]&退出
echo$$>/tmp/lockfile
[$(比杀戮更好的是让尾巴正确退出:
tail-n0--pid=$($BASHPID+1))-F日志文件| sed'/日志中的特殊事件字符串/q'
在管道中,pid是顺序的,因此尾部的pid将是$BASHPID,而sed的pid将是$BASHPID+1。sed命令退出时,-pid开关将导致tail退出(正确!)。显然这是一个bashism。谢谢。实际上,我正在发出“tail start”和“tail end”来自打开会话的其他代码的命令。换句话说,睡眠不是一个固定值。您的方法在这里有效吗?&1
不是一个文件,而是对文件描述符=1的引用,它是标准输出。您可能需要阅读一些有关unix重定向的基本教程。如果您想将其保存在一个文件中,请使用tail-f/var/log/sample.log>/tmp/file.out 2>&1&
假设您有权限写入/tmp/file.out
让我重新表述一下。理想情况下,我希望我的代码能够像putty那样将输出发送到控制台。目前,我只是将尾部输出放在tmp文件夹中,然后从那里检索。希望这是有意义的。谢谢。实际上,您可以选择不在任何文件中重定向,只以tail-f/var/log/sample.log&
的形式运行命令,但您在上面写道,此命令具有无休止的尾部。您还可以使用pgrep tail
命令从其他putty会话获取tail
的进程id。我可以手动一个接一个地发出这些命令进行测试吗ing?是的,但您很难做到这一点,因为第一个命令将继续跟踪屏幕上的文件。您必须在终端上复制粘贴第二行并按ENTER键。如果操作正确,屏幕上的跟踪输出将停止。这不是一个好的解决方案-它将尝试终止用户拥有的所有跟踪进程任务是杀死…或者实际上,任何进程的名字中任何地方都有“tail”!它不是。我只是想解释OP找到的“解决方案”。编辑我的答案以澄清这一点。只有ps对我不起作用。我必须使用ps ax。所以现在的命令是kill`ps ax|grep tail | awk'{print$1;}“`
如果有一种方法可以从ssh客户端发送Ctrl+C,那对你有用吗?@psmears-当然。那也可以。我要做的就是告诉unix跟踪一个文件,随时停止跟踪它,并在开始和结束跟踪之间获取输出。谢谢。@BoratSagdiyev,当你说在开始和结束之间获取输出时。”你的意思是在一个文件中吗?一旦赏金到期,这应该作为一个副本关闭。这是一个常见问题解答,你可以通过谷歌很容易地找到答案。可能的副本
mkfifo /tmp/holder
tail -f /var/log/syslog &
TailPid=$!
cat >/dev/null /tmp/holder
kill -9 $TailPid
echo >/tmp/holder
#!/bin/bash
[ -e /tmp/lockfile ] && exit
echo $$ >/tmp/lockfile
[ $(</tmp/lockfile) -ne $$ ] && exit
cd /var/log
tail -f syslog &
export tPid=$!
trap "kill $tPid;rm /tmp/lockfile;exit 0" 12
wait $tPid
kill -USR2 $(</tmp/lockfile)
ssh -T root@remoteMachine /bin/bash <<"eocmd"
[ -e /tmp/lockfile ] && exit
echo $$ >/tmp/lockfile
[ $(</tmp/lockfile) -ne $$ ] && exit
cd /var/log
tail -f syslog &
export tPid=$!
trap "kill $tPid;rm /tmp/lockfile;exit 0" 12
wait $tPid
eocmd
ssh root@remoteMachine '/bin/bash -c "kill -USR2 $(</tmp/lockfile)"'