我有一个简短的脚本,可以启动一个应用程序,等待一个小时,然后终止它并等待一分钟。它只会启动应用程序。我尝试以普通用户和 root 身份运行该脚本,但没有任何帮助。
while (true); do
./app
sleep 3600
pkill -f app
sleep 60
done
答案1
问题是所有命令都是按顺序从第一行到最后一行执行的。因此,正如@Scott Stensland
所提到的,您必须通过&
(&) 将其置于后台才能启动计时器。
此外,我认为通过搜索进程名称来获取应用程序的 PID 是一种危险的做法,因为您可能会意外终止app
名称中包含字符串的程序。因此,更安全的方法是使用变量!
来获取 PID 。因此,您修改后的脚本现在应如下所示:
while (true); do
./app &
app_pid=$!
sleep 3600
kill $app_pid
sleep 60
done
当你将一个进程放入后台时,&
它会进入工作父 bash 进程的列表,通过!
它可以获取最后一个作业的 PID。所以它是安全的。
答案2
您可以考虑使用以下timeout
命令:
NAME
timeout - run a command with a time limit
SYNOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.
前任。
#!/bin/bash
while :
do
timeout 1h ./app
sleep 1m
done