Сохранение скрипта bash в запущенной программе и отправка ввода программы - PullRequest
2 голосов
/ 07 октября 2010

Я пишу очень простой сценарий для управления процессом, сценарий проверяет, запущен ли процесс, если нет: выполняет его.

Мне нужно расширить его с возможностью уничтожения определенного экземпляра процесса(очень один сценарий запущен) через определенное время.Проблема в том, что после запуска bash-скрипта он не запускается до тех пор, пока не завершится исполняемая программа. Также была бы полезна возможность передать некоторые входные данные процессу, поскольку у меня есть изящная функция выхода, встроенная в службу, которую я запускаю.

По сути, мой bash-скрипт должен запускаться в процессе, который он запускает, и посылать команду kill через stdin после тайм-аута сна x.

Как переслать некоторые сценарии ввода в запущенный скрипт процессаи как сохранить скрипт работающим после выполнения процесса?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Если вы хотите запустить процесс вместе со сценарием, вам нужно запустить его в фоновом режиме:

command &
pid=$!

Теперь pid будет содержать PID процесса, который вы только что начали. Далее вам нужен способ общения с процессом. Если вам просто нужно отправить какой-то вклад в процесс, используйте «здесь документ»:

command <<EOF
input
more input
even more input
var=$HOME
EOF

Это становится сложнее, если вам все еще нужно запустить процесс в фоновом режиме. Либо записать ввод во временный файл (см. mktemp(1)):

tmp=$(mktemp)
cat > "$tmp" <<EOF
input
more input
even more input
var=$HOME
EOF
command < "$tmp" &
pid=$!

или вы можете использовать именованные каналы (FIFO). Эта статья должна помочь вам начать.

0 голосов
/ 07 октября 2010

Вы можете легко изменить этот сценарий в соответствии со своими потребностями, но вот сценарий, который будет ожидать завершения процесса или отправить электронное письмо после того, как оно спит ограниченное количество времени.

#!/bin/sh
SLEEPTIMEOUT=3600
SLEEPCOUNTER=0
SLEEPLIMIT=5

while ps ax | grep -v grep | grep "yourprocess" > /dev/null
do
sleep $SLEEPTIMEOUT
SLEEPCOUNTER=$((SLEEPCOUNTER+1))
echo $SLEEPCOUNTER
if [ $SLEEPCOUNTER -gt $SLEEPLIMIT ]
then
`echo "slept $SLEEPLIMIT times and waited $SLEEPTIMEOUT seconds each time but process is still running" | mailx -s "waited" $EMAIL`
exit 1
fi
done
0 голосов
/ 07 октября 2010

Используйте pgrep (см. man pgrep, чтобы увидеть, что он делает)

pgrep my_process || ./my_process
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...