我是Linux中所有内容的初学者,所以请慢慢来。
我创建了一个"脚本"那是在后台运行的:
while true; do echo "I'm alive" >> alive.log ; done &
脚本的输出保存在用户主目录中的文件alive.log中。 问题是我没有想法如何杀死循环,因为它填充了我的磁盘空间,如果我想删除文件,那么循环将创建一个新文件并用文本填充它"我&#39 ; m alive"正如我所要求的那样。
我尝试使用:
ps - aux | grep while
或
ps - aux | grep alive
这两行的输出将给出我需要的PID,但问题是脚本是一个循环,这意味着PID每次运行时都会改变(递归),所以我不能使用PID杀死这个过程。
我也尝试过使用:
pkill while
killall while
两行的结果都是0(使用pkill时可以看到输出,而-c" 0"或killall while:" while:没有找到进程&#34 ;;
有什么建议吗?
答案 0 :(得分:1)
如果您运行该脚本,如果您命令bash
,它将显示为ps -ef
:
UID PID PPID C STIME TTY TIME CMD
james 27262 2448 98 17:35 pts/3 00:00:12 bash
james 2448 2446 0 Jul19 pts/3 00:04:49 bash
(如果您使用bash
)并且其父pid也指向bash
进程(PID 27262是您上面的紧密循环)。因此,查找具有bash
进程的所有bash
进程作为父进程。这可能有效:
$ awk '/^james/ && $NF=="bash" && NR==FNR{a[$2];next} /^james/ && $NF=="bash" && $3 in a{print $2}' <(ps -ef) <(ps -ef)
27262
27359
所以,那些是杀人的好人选。在这种情况下,另一个是ps -ef
,另一个是标记。
答案 1 :(得分:1)
这是@James Brown在评论中的答案。
键入fg
以将其置于前台并使用ctrl-c
以最快的方式将其终止。
答案 2 :(得分:0)
我决定尝试你的&#34;脚本&#34;在后台。我跑的时候
while true; do echo "I'm alive" >> alive.log ; done &
它将进程ID返回到标准输出,从而显示进程在后台运行。您可以使用以下命令终止此进程ID:
kill <pid>
答案 3 :(得分:0)
尝试重新启动两次,第一次没有工作,但在第二次之后循环不再存在,文件将不会被重写。
此外,在我摆脱它后,我重新进入了剧本:
while true; do echo "I'm alive" >> alive.log ; done &
正如@ssharma所说,当输入脚本时,输出是一个PID,即使循环不断改变PID我也能够用该PID杀死循环。
感谢您的帮助!
答案 4 :(得分:0)
我在一个名为while.sh的脚本文件中编写了这个句子,并通过shell运行它:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4036 edemon 20 0 5268 756 436 R 97.3 0.0 0:07.93 bash
2469 root 20 0 94412 29m 10m S 7.8 2.0 1:49.19 Xorg
2788 edemon 20 0 74300 12m 10m S 1.9 0.9 1:38.79 nm-applet
4040 edemon 20 0 2708 1072 796 R 1.9 0.1 0:00.01 top
没有PID。 我使用top命令工具搜索我的while.sh,它告诉我:
{{1}}
while的父亲进程是bash,所以我杀了4036. alive.log的大小不再增长。