#!/bin/bash # 持续查询 eef 进程的 pid while true do #查询进程pid eef_pid=$(pgrep eef) if [ -n "$pid" ]; then # 执行 top 命令,输出到 /tmp/test.txt top -b -d 60 -p "$eef_pid" >/tmp/test.txt # 记录top命令的进程号 top_pid=$! break fi #暂停1s后继续查询 sleep 1 done # 检测eef进程是否存在 while [[ -e /proc/$eef_pid ]] do sleep 1 done # 如果eef进程不存在了,就结束top命令 kill -9 $top_pid exit 结尾的exit为什么没有生效
时间: 2023-12-14 14:36:49 浏览: 121
这是因为 exit 命令只会终止当前 shell 进程,而不会终止在当前 shell 进程中启动的子进程。在你的脚本中,top 命令是在一个子进程中执行的,因此即使在该子进程中执行了 exit 命令,也不会终止主进程。如果你希望在 top 命令执行完毕后立即终止脚本,可以在执行 top 命令时使用 exec 命令将子进程替换为 top 命令,并在 top 命令执行完毕后直接退出脚本,例如:
```
#!/bin/bash
# 持续查询 eef 进程的 pid
while true
do
#查询进程pid
eef_pid=$(pgrep eef)
if [ -n "$eef_pid" ]; then
# 执行 top 命令,输出到 /tmp/test.txt
exec top -b -d 60 -p "$eef_pid" >/tmp/test.txt
fi
#暂停1s后继续查询
sleep 1
done
# 如果 top 命令执行完毕,就直接退出脚本
exit
```
这样,在 top 命令执行完毕后,脚本就会立即退出,不需要再使用 kill 命令终止 top 进程了。
相关问题
持续查询 eef 进程的 pid while true do #查询进程pid eef_pid=$(pgrep eef) if [ -n "$eef_pid" ]; then # 执行 top 命令,输出到 /tmp/test.txt top -b -d 60 -p "$eef_pid" >/tmp/test.txt # 记录top命令的进程号 top_pid=$! break fi #暂停1s后继续查询 sleep 1 done 修改代牧,使eef进程结束时,kill top命令
你可以尝试这样修改代码:
```bash
#!/bin/bash
# 查询进程pid,并不断查询直到找到为止
while true; do
eef_pid=$(pgrep eef)
if [ -n "$eef_pid" ]; then
# 执行 top 命令,输出到 /tmp/test.txt
top -b -d 60 -p "$eef_pid" >/tmp/test.txt &
top_pid=$! # 记录top命令的进程号
wait "$top_pid" # 等待top命令结束
break
fi
#暂停1s后继续查询
sleep 1
done
```
这样修改后,当eef进程结束时,会自动结束top命令。使用`wait`命令等待top命令结束的原因是,必须等待top命令执行完毕后,才能执行break退出循环,否则会导致top命令一直运行下去。
写一个shell脚本,使top -b -d 60 -p "$eef_pid" >/tmp/test.txt在eef进程结束后能自动停止
以下是一个简单的脚本实现:
```bash
#!/bin/bash
# 设置 eef 进程的 PID
eef_pid=1234
# 启动 top 命令并将输出重定向到文件
top -b -d 60 -p "$eef_pid" >/tmp/test.txt &
# 获取 top 命令的PID
top_pid=$!
# 等待 eef 进程结束
while kill -0 "$eef_pid" 2>/dev/null; do
sleep 1
done
# 终止 top 命令
kill "$top_pid"
```
脚本中的 `kill -0 "$eef_pid" 2>/dev/null` 用于检查 eef 进程是否存在,如果不存在则退出循环。 `kill` 命令发送信号给进程,但当信号为 0 时,它只是检查进程是否存在而不会发送任何信号。因此,检查进程是否存在时,使用信号0比发送其他信号更好,因为它不会影响进程状态,也不会产生任何副作用。
阅读全文