LINUX.ORG.RU

[BASH] Убить дубль скрипта

 


0

2

Не пинайте сильно, с BASH только знакомлюсь. Возникла необходимость проверить дубль запуска скрипта, и если он запущен то убить старый.

Это не работает

#!/bin/sh

PID_OLD=`ps aux | grep status.sh | grep Ss | awk {'print $2'}`
PID_NEW=`echo $$`

if $PID_OLD != $PID_NEW
then kill -9 $PID
fi

★★

Последнее исправление: Sora (всего исправлений: 1)

можно при запуске скрипта записывать pid в /tmp/my_script_pid.

И из скрипта читать его же и проверять на существование.

В конце работы скрипта его, естественно, надо удалить.

xapienz
()

убивай без всяких проверок.

killall cкрипт & скрипт

anonymous
()

Воспользуйтесь flock для создания lock-файла и проверяйте в начале скрипта, заблокирован ли файл. Если да, завершайтесь.

AITap ★★★★★
()

Да вы ебанутые все.Нафига эти нагромождения и ненужные сложности(tmp, flock) , прямо феерия велосипедостроения.

Мозг включите.

anonymous
()

Вот тебе вариант получить PID -ы копий твоего скрипта

zen@debian:~$ ./isrunning.sh &
[1] 29848
zen@debian:~$ ./isrunning.sh &
[2] 29854
zen@debian:~$ ./isrunning.sh &
[3] 29860
zen@debian:~$ ./isrunning.sh &
[4] 29866
zen@debian:~$ ./isrunning.sh &
[5] 29872
zen@debian:~$ ./isrunning.sh &
[6] 29878
zen@debian:~$ ./isrunning.sh &
[7] 29884
zen@debian:~$ ./isrunning.sh &
[8] 29890
zen@debian:~$ pgrep -f isrunning.sh  | grep -v 29890
29848
29854
29860
29866
29872
29878
29884
zen@debian:~$ 
А дальше, хочешь убивай процессы, а хочешь просто прекращай работу текущего скрипта...

Punk
()
Ответ на: комментарий от Tanger

if [ -e $pid ]

Представим kernel panic, перезапуск системы и... под тем же pid скрывается теперь уже иной процесс. Может хотя бы имена команды проверить на всякий случай?

Punk
()
Ответ на: комментарий от Tanger

только опечатку исправил.

да, я заметил это после того как отписался ). Кстати, отрыл у себя такой вариант, некогда активно использовал:

#!/bin/bash
LOCK_FILE=/tmp/my_script.lock
if [ -e $LOCK_FILE ]
then
	PID=`cat $LOCK_FILE`
	PID_NAME=`ps -p $PID -o comm=`
	if [ ! -z $PID_NAME ]
	then  
		echo "Скрипт $0 найден в списке процессов";
		exit -1; 			
	else 						
		echo "Обнаружен lock-файл с несуществующим ID процесса"
		rm $LOCK_FILE 	
	fi
fi
echo $$ > $LOCK_FILE 	
#######
#ДАЛЕЕ#
# КОД #
#######
rm $LOCK_FILE 	
exit 0;

Используя pgrep код явно будет проще, компактнее и быстрее.

Punk
()

grep, pgrep, flock...
мужики, вы чего?

$ man pidof

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.