LinuxForum.Fans
Тема

Создание скрипта по запуску браузера по старту и kill -1 при выключени

Автор: svad05 13 сообщений 5863 просмотров
#23482

Доброго времени суток.
Помогите пожалуйста написать скрипт для запуска браузреа(любого) при загрузке Debian 5.0.4 и его уничтожения командой kill -1(обязательно 1 - т.к иначе ,при следующем запуске, браузер выдает окно что работа завершена некорректно) при выключении.
У меня уже есть кусок скрипта для запуска браузера(назовем его кусок-1), а так-же кусок для его уничтожения kill-ом(кусок-2).
Проблема в том, что в упор не понятно как это все соединить чтобы работало как надо, т.е кусок-1 только по старту и кусок-2 только при останове.
Копался в мануалах насчет update-rc.d и LSBInitScript, но так ничего и не получилось.

#23489

А зачем их соединять? Поместите скрипт для уничтожения в /etc/init.d,
а в /etc/rcx.d, каких надо, сделайте на него ссылки, начинающиеся с K,
хоть вручную, хоть с помощью update-rc.d.

Пётр.

#23491

Сходите в папку: /etc/init.d/ , посмотрите как пишутся скрипты для целей start и stop. Создайте по аналогии свой скрипт, поместите его в эту папку, дайте ему права на выполнение типа: chmod 755 /etc/init.d/ваш_скрипт ; запустите что-то типа: update-rc.d ваш_скрипт defaults 99 01 .

#23493

vladlen_msk, делаю как Вы написали но не получается.Содержание скрипта следующее:
#! /bin/sh
### BEGIN INIT INFO
# Provides: startscript1
# Required-Start: $all
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO


case "$1" in
start)
echo "Iceweasel starting..."
sh iceweasel
;;
stop)
echo "Find iceweasel's PID..."
z='iceweasel'
y=`ps ax|grep -w $z|grep -v grep|awk '{print $1}'`
if [ -n $y ];then
kill -1 $y;
echo \ 'Iceweasel terminated'
else
echo \ 'Iceweasel not found'
fi
;;
restart)
echo "ccccccccccccccccccccc"
;;
reload)
echo "ddddddddddddddddddddd"
;;
*)
echo "CCCCCCCCCCCCCCCCCCCC"
exit 1
;;
esac

exit 0

#23494

для отладки вашего скрипта используйте команды:
/etc/init.d/ваш_скрипт start # для запуска

/etc/init.d/ваш_скрипт stop # для останова

и смотрите ошибки...

еще может быть ньюанс, что gdm к моменту запуска скрипта не успеет запуститься\загрузиться , поэтому возможно потребуется ввести задержку при запуске броузера

хм... и еще "sh iceweasel" - это в какой консоли запустится? GDM стартует в 7 косноли.... Др. словами под иксами скрипт работать будет , а при загрузке в таком варианте нет...
родитель для процесса iceweasel должен быть GDM

Как вариант запускать броузер в гноме стандартными средствами : система-параметры-сеансы
скрипт для запуска писать такой, чтобы сохранял PID запущенного процесса во временном файле...
а при выключении читаем этот PID и убиваем процесс
хтя PID можно и не сохранять, а вычислять его по имени через ps -ef

но все это как -то коряво...

надо гуру подождать, что они скажут...

#23499

Запускаться iceweasel должен от пользователя, например, при его входе,
а получать pid можно утилитой pidof.

Пётр.

#23516

vladlen_msk
Делал sleep 10s перед запуском iceweasel - не помогло.
попробовал вариант когда запуск через сеансы, а остановка по скрипту - не помогло.В момент выключения на экране сообщение об ошибке в скрипте(хотя если с терминала запускать, то все нормально).Есть подозрение,что браузер закрывается раньше чем начинает выполняться скрипт по стопу.

Peter,
Пользователь в системе всего один, вход в систему происходит автоматом - без ввода пароля.
Запускаю в терминале pidof -s iceweasel но ничего не проиходит.

P.S. В Debian есть разника между выключением через меню система и выключением по нажатию кнопки питания(В ПАРАМЕТРЫ УПРАВЛЕНИЯ ПИТАНИЕМ настроено на завершение работы при нажатии кнопки питания) ?
Просто мне необходимо выключать компьютер именно по нажатию кнопки.

#23573

выключение питания это переход на runlevel 0 , в папке /etc/rc0 первой на выполнение стоит команда: @K01gdm - а это значит, что запустится скрипт "/etc/init.d/gdm" с параметром "stop" ... дык может просто подправить этот скрипт для своих целей?

PID процесса можно получить вычленив второй столбик из запроса:
ps -ef | grep iceweasel | grep -v grep

#23598

pidof должна выводить pid процесса, его можно сразу же использовать:

text
kill -1 `pidof -s iceweasel`

Ещё можно так, там в pid будет в nmb:

text

#!/bin/bash

echo $# "$1" if [ $# = 0 ] || [ $1 = "visible-stats" ]; then nmpr=iceweasel else nmpr=$1 fi stnm=`ps -o pid,cmd -C $nmpr ` echo $nmpr $stnm nmb=`echo $stnm|awk -F " " '{printf("%s", $3)}' ` if [ "$nmb" != "" ] ; then echo "pid="$nmb else echo "No pid" fi

И всё равно владельцем iceweasel должен быть пользователь.

Пётр.

#23695

И всё равно владельцем iceweasel должен быть пользователь.

А возможно ли тогда запустить iceweasel в скрипте от имени пользователя?

#24169
svad05 написал:
И всё равно владельцем iceweasel должен быть пользователь.

А возможно ли тогда запустить iceweasel в скрипте от имени пользователя?

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

#24247
svad05 написал:
И всё равно владельцем iceweasel должен быть пользователь.

А возможно ли тогда запустить iceweasel в скрипте от имени пользователя?

Если у вас bash, вставьте его запуск в какой-нибудь из пользователських файлов:
~/.bash_login, ~/.session, ~/.Xclients, ликвидацию - в ~/.bash_logout. У меня tcsh.

Пётр.

#24578

Значит так
Во-первых заменил браузер Iceweasel на opera по причине более удобного конфигурирования из командной строки, а значит и скрипта.
Во-вторых заметил следующее:
При перезагрузке системы и при выключении КАК_ПОЛОЖЕНО(т.е через меню СИСТЕМА) мой скрипт выполняется по стопу.
А при выключении с помощью кнопки питания, скрипт выполняется почему-то по старту.
Поэтому в инит.дэ указываю нулевые уровни по старту и стопу.

Почему так происходит?

Скрипт приобрел вид:
#! /bin/sh
### BEGIN INIT INFO
# Provides: startscript1
# Required-Start: $all
# Required-Stop: $remote_fs
# Default-Start: 5
# Default-Stop: 0
# Short-Description: Start and Stop Iceweasel
# Description: Start and Stop Iceweasel.
### END INIT INFO

# Author: Foo Bar <foobar@baz.org>
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

case "$1" in
start)
echo "Find opera's PID..."
z='opera'
y=`ps ax|grep -w $z|grep -v grep|awk '{print $1}'`
if [ -n $y ];then
#kill -1 $y;
echo \ 'Opera terminated'
else
echo \ 'Opera not found'
fi
;;
stop)
echo \ "stoppppppppppppppppppppppppppppppppppppppppppp"
;;
restart)
echo \ "restarttttttttttttttttttttttttttttttttttttttttt"
;;
reload)
echo "reloadddddddddddddddddddddddddddddddddddddddddddd"
;;
*)
echo "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
exit 1
;;
esac

:

Получилось!
Запуск оперы через СЕАНСЫ.
Остановка через скрипт. В инит.де по старту 99 00-по стопу

Скрипт опять поменялся:
#! /bin/sh
### BEGIN INIT INFO
# Provides: startscript1
# Required-Start: $all
# Required-Stop: $remote_fs
# Default-Start: 5
# Default-Stop: 0
# Short-Description: Start and Stop Iceweasel
# Description: Start and Stop Iceweasel.
### END INIT INFO

# Author: Foo Bar <foobar@baz.org>
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

case "$1" in
start)
echo "startttttttttttttttttttttttttttttttttttttttttttt"
;;
stop)
echo \ "stoppppppppppppppppppppppppppppppppppppppppppp"
echo \ "Find opera's PID..."
z='opera'
y=`ps ax|grep -w $z|grep -v grep|awk '{print $1}'`
if [ -n $y ];then
kill -1 $y;
echo \ 'Opera terminated'
else
echo \ 'Opera not found'
fi
;;
restart)
echo \ "restarttttttttttttttttttttttttttttttttttttttttt"
;;
reload)
echo "reloadddddddddddddddddddddddddddddddddddddddddddd"
;;
*)
echo "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
exit 1
;;
esac

:

Войдите или зарегистрируйтесь, чтобы ответить.