Доброго времени суток.
Помогите пожалуйста написать скрипт для запуска браузреа(любого) при загрузке Debian 5.0.4 и его уничтожения командой kill -1(обязательно 1 - т.к иначе ,при следующем запуске, браузер выдает окно что работа завершена некорректно) при выключении.
У меня уже есть кусок скрипта для запуска браузера(назовем его кусок-1), а так-же кусок для его уничтожения kill-ом(кусок-2).
Проблема в том, что в упор не понятно как это все соединить чтобы работало как надо, т.е кусок-1 только по старту и кусок-2 только при останове.
Копался в мануалах насчет update-rc.d и LSBInitScript, но так ничего и не получилось.
Создание скрипта по запуску браузера по старту и kill -1 при выключени
А зачем их соединять? Поместите скрипт для уничтожения в /etc/init.d,
а в /etc/rcx.d, каких надо, сделайте на него ссылки, начинающиеся с K,
хоть вручную, хоть с помощью update-rc.d.
Пётр.
Сходите в папку: /etc/init.d/ , посмотрите как пишутся скрипты для целей start и stop. Создайте по аналогии свой скрипт, поместите его в эту папку, дайте ему права на выполнение типа: chmod 755 /etc/init.d/ваш_скрипт ; запустите что-то типа: update-rc.d ваш_скрипт defaults 99 01 .
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
для отладки вашего скрипта используйте команды:
/etc/init.d/ваш_скрипт start # для запуска
/etc/init.d/ваш_скрипт stop # для останова
и смотрите ошибки...
еще может быть ньюанс, что gdm к моменту запуска скрипта не успеет запуститься\загрузиться , поэтому возможно потребуется ввести задержку при запуске броузера
хм... и еще "sh iceweasel" - это в какой консоли запустится? GDM стартует в 7 косноли.... Др. словами под иксами скрипт работать будет , а при загрузке в таком варианте нет...
родитель для процесса iceweasel должен быть GDM
Как вариант запускать броузер в гноме стандартными средствами : система-параметры-сеансы
скрипт для запуска писать такой, чтобы сохранял PID запущенного процесса во временном файле...
а при выключении читаем этот PID и убиваем процесс
хтя PID можно и не сохранять, а вычислять его по имени через ps -ef
но все это как -то коряво...
надо гуру подождать, что они скажут...
Запускаться iceweasel должен от пользователя, например, при его входе,
а получать pid можно утилитой pidof.
Пётр.
vladlen_msk
Делал sleep 10s перед запуском iceweasel - не помогло.
попробовал вариант когда запуск через сеансы, а остановка по скрипту - не помогло.В момент выключения на экране сообщение об ошибке в скрипте(хотя если с терминала запускать, то все нормально).Есть подозрение,что браузер закрывается раньше чем начинает выполняться скрипт по стопу.
Peter,
Пользователь в системе всего один, вход в систему происходит автоматом - без ввода пароля.
Запускаю в терминале pidof -s iceweasel но ничего не проиходит.
P.S. В Debian есть разника между выключением через меню система и выключением по нажатию кнопки питания(В ПАРАМЕТРЫ УПРАВЛЕНИЯ ПИТАНИЕМ настроено на завершение работы при нажатии кнопки питания) ?
Просто мне необходимо выключать компьютер именно по нажатию кнопки.
выключение питания это переход на runlevel 0 , в папке /etc/rc0 первой на выполнение стоит команда: @K01gdm - а это значит, что запустится скрипт "/etc/init.d/gdm" с параметром "stop" ... дык может просто подправить этот скрипт для своих целей?
PID процесса можно получить вычленив второй столбик из запроса:
ps -ef | grep iceweasel | grep -v grep
pidof должна выводить pid процесса, его можно сразу же использовать:
kill -1 `pidof -s iceweasel`Ещё можно так, там в pid будет в nmb:
#!/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 должен быть пользователь.
Пётр.
И всё равно владельцем iceweasel должен быть пользователь.
А возможно ли тогда запустить iceweasel в скрипте от имени пользователя?
И всё равно владельцем iceweasel должен быть пользователь.
А возможно ли тогда запустить iceweasel в скрипте от имени пользователя?
Все запускаемые процессы в системе по умолчанию получают права родителя, если Вы регистрируетесь при входе пользователем, то для данной сессии все процессы порождаются от вашего имени... Исключение составляют лишь процессы в исполняемом файле которых стоит "суицидный бит" - эти процессы запускаются под правами владельца этого исполняемого файла.
И всё равно владельцем iceweasel должен быть пользователь.
А возможно ли тогда запустить iceweasel в скрипте от имени пользователя?
Если у вас bash, вставьте его запуск в какой-нибудь из пользователських файлов:
~/.bash_login, ~/.session, ~/.Xclients, ликвидацию - в ~/.bash_logout. У меня tcsh.
Пётр.
Значит так
Во-первых заменил браузер 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
: