У меня есть короткий сценарий, который должен запустить приложение, подождать час, затем убить его и подождать минуту. Он только запускает приложение. Я пробовал запускать скрипт как под обычным пользователем, так и под root, но ничего не помогло.
while (true); do
./app
sleep 3600
pkill -f app
sleep 60
done
Проблема в том, что все команды выполняются от первой строки до последней по порядку. Таким образом, @Scott Stensland
наставлял, что вы должны поместить его в фоновый режим через &
(амперсанд), чтобы запустить таймер.
И, кроме того, я думаю, что получить PID вашего приложения через поиск по именам процессов - опасная практика, поскольку вы можете случайно убить программу, в названии которой содержится строка app
. Поэтому более безопасный способ - использовать переменную !
для получения PID. Таким образом, ваш измененный скрипт теперь должен выглядеть следующим образом:
while (true); do
./app &
app_pid=$!
sleep 3600
kill $app_pid
sleep 60
done
Когда вы помещаете процесс в фоновый режим через &
, он попадает в список job родительского процесса bash и через !
вы можете получить PID последней работы. Так что это безопасно.
You could consider using the timeout
command:
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.
ex.
#!/bin/bash
while :
do
timeout 1h ./app
sleep 1m
done