Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在脚本中停止tail命令_Linux_Bash_Unix - Fatal编程技术网

Linux 如何在脚本中停止tail命令

Linux 如何在脚本中停止tail命令,linux,bash,unix,Linux,Bash,Unix,我想做的是-开始使用自定义ssh客户端代码***捕获对日志文件的更改。一段时间后(不是固定值,是基于事件的),发出命令停止跟踪。这是我用来捕获日志文件最新更改的命令-tail-f logfile.txt 我希望能够以类似于:q的东西结束它,我可以从脚本中发出它。我不想使用键盘命令,如ctrl+c ***自定义ssh客户端代码的伪代码(用oop语言编写) 我对日志文件所在的服务器没有写访问权限 我试过的- 我无法理解那里的解决方案(在帖子2中)。有人能解释一下解决方案或提出不同的方法吗 谢谢。在脚

我想做的是-开始使用自定义ssh客户端代码***捕获对日志文件的更改。一段时间后(不是固定值,是基于事件的),发出命令停止跟踪。这是我用来捕获日志文件最新更改的命令-
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)"'