我对 Linux 的所有方面都是初学者,所以请慢慢来。
我创建了一个在后台运行的“脚本”:
while true; do echo "I'm alive" >> alive.log ; done &
脚本的输出保存在用户主目录中的 alive.log 文件中。 问题是我不知道如何终止循环,因为它填满了我的磁盘空间,如果我想删除该文件,那么循环将创建一个新文件并按照我的要求用文本“我还活着”填充它它要做。
我尝试使用:
ps - aux | grep while
或
ps - aux | grep alive
这两行的输出将为我提供所需的 PID,但问题是脚本是一个循环,这意味着 PID 每次运行时都会更改(递归),因此我无法使用 PID 来终止进程。
我也尝试过使用:
pkill while
killall while
这两行的结果都是 0(使用 pkill while -c "0" 或 Killall while : "while: no process found" 时可以看到输出;
请问有什么建议吗?
这是@James Brown 在评论中的回答。
输入
fg
将其置于前台并使用 ctrl-c
杀死它,这是解决此问题的最快方法。
如果您运行该脚本,如果您命令
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
,另一个是标记。
我决定在后台尝试一下你的“脚本”。当我跑步时
while true; do echo "I'm alive" >> alive.log ; done &
它将进程 ID 返回到标准输出,从而表明该进程正在后台运行。您可以通过以下方式终止此进程 ID:
kill <pid>
尝试重新启动两次,第一次不起作用,但第二次之后循环不再存在,文件不会被重写。
另外,在我摆脱它之后,我重新输入了脚本:
while true; do echo "I'm alive" >> alive.log ; done &
正如 @ssharma 所说,当输入脚本时,输出是一个 PID,即使循环不断更改 PID,我也能够使用该 PID 终止循环。
感谢您的帮助!
就我而言,我已将 while 循环重定向到一个文件,它仅在前台运行,但由于 VPN 断开连接,我在远程主机上的会话受到干扰,但不知何故它仍在后台运行并更新输出文件。而且它也没有显示在“top”命令(或)ps -ef | grep“while”中来杀死它。
我用来找出在后台不断更新文件的进程 ID (PID) 的解决方法是:使用“fuser”。 fusionr
while sleep 2; do date ;curl `hostname -i`:8009/member|jq 2>/dev/null; done >/tmp/dev-dataquery.txt
fuser 命令(Find USER)是一个进程管理工具,它使用文件、目录或套接字来识别进程
fuser dev-dataquery.txt
/tmp/dev-dataquery.txt: 3992317 4068085
kill -9 3992317
kill -9 4068085
我把这句话写在一个名为 while.sh 的脚本文件中,并通过 shell 运行它:
[edemon@CentOS workspace]$ ./while.sh
[edemon@CentOS workspace]$
没有PID。 我用top命令工具搜索我的while.sh,它告诉我:
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
while的父进程是bash,所以我杀死了4036。alive.log的大小不再增长。