Форум русскоязычного сообщества Ubuntu


Автор Тема: Вопрос по написанию sh-скрипта  (Прочитано 1922 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Вопрос по написанию sh-скрипта
« : 16 Июня 2010, 17:45:54 »
Задача проста. Вначале нехитрого скрипта нужно вставить кусок:

if [первый раз]
   выполнить прогу
fi

Под первым разом понимается первый запуск после перезагрузки машины.
Можно ли добавить переменную среды и заюзать ее в качестве флага? Если да, то как?
Не хочется плодить файлы.

Пользователь решил продолжить мысль 16 Июня 2010, 17:48:35:
Такой изврат нужен, потому что программа не хочет инициализировать оборудование при запуске Линукса. Помню, куда-то прописывал, но не получилось...
« Последнее редактирование: 16 Июня 2010, 17:48:35 от Tarik »

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #1 : 16 Июня 2010, 19:16:08 »
Лучше опиши исходную задачу. Может её удасться на прямую решить, а не через задний проход.

По вопросу:
Переменную среды заюзать не удасться так как они у каждого процесса свои. Соответственно если установить переменную в одном скрипте то при следующем запуске этой переменной всё равно не будет. Нужен именно файл, который ты будешь удалять в rc.local и будешь проверять его наличие в своём скрипте, а так же создавать. Файл лучше всего ложить в /val/lock по смыслу ему почти там и место.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #2 : 17 Июня 2010, 08:36:26 »
Чтобы выполнить скрипт при загрузке надо:
- написать сам скрипт и его отладить
- сделать симлинк на него в /usr/bin
     sudo ln -s /home/username/scripts/scriptname /usr/bin/
- записать в rc.local(до последней строчки `exit 0`) команду  - имя скрипта.

И все дела. Это будет эквивалент типа autoexec.bat в вантузе.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #3 : 17 Июня 2010, 14:59:16 »
Спасибо за ответы. Проблема решилась очень просто.
Надо было в файле rc.local, прежде чем запускать программу, перейти в директорию с ней. :)
Так что с программой, которая должна запускаться 1 раз, решено.

Появилась другая проблема.
Есть 3 сервера, которые хотелось бы запускать одним скриптом.
Мне удалось это сделать так:
#!bin/sh

(запуск сервера1)&

sleep 2

(запуск сервера2)&

sleep 2

запуск сервера3
Серверы 1 и 2 - консольные, а 3 - гуевый.
Все запускается подряд, как надо, но при закрытии гуевого сервера, консольные остаются висеть и их приходится убивать через системный монитор. Необходимо реализовать также одновременное выключение всех серверов. Может есть у кого идеи?
« Последнее редактирование: 17 Июня 2010, 15:01:02 от Владимир Николаевич »

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #4 : 17 Июня 2010, 15:03:08 »
#!bin/sh

(запуск сервера1)&
sleep 2
(запуск сервера2)&
sleep 2
# Обращаем особое вниманеи на отутствие & в конце следующей строки
запуск сервера3

остановка сервера 2
остановка сервера 1

Собственно пока гуёвый процесс живёт твой скрипт висит в памяти и ждёт, а как он завершился, производится остановка первых двух. всё гениальное просто ;)

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #5 : 17 Июня 2010, 15:15:46 »
Так в том-то и дело, что не останавливаются первые 2.

Пользователь решил продолжить мысль 17 Июня 2010, 15:19:04:
Прошу прощения, а как остановить процесс? :)
« Последнее редактирование: 17 Июня 2010, 15:19:04 от Tarik »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Вопрос по написанию sh-скрипта
« Ответ #6 : 17 Июня 2010, 15:23:11 »
Запускайте 3-й из терминала.
Проверяйте, корректно ли он завершается при закрытии, т.е. передаётся ли управление обратно командному интерпретатору.
Также из терминала проверяйте корректность отработки команд остановки 1-го и 2-го.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #7 : 17 Июня 2010, 15:26:35 »
Все правильно, вконце скрипта нужно как-то остановить первые 2 процесса.
Когда они работают обособленно, то перехватывают нажатие на Ctrl-C.
Нужно как-то это им передать, я не знаю как.
А по отдельности завершается все корректно.
« Последнее редактирование: 17 Июня 2010, 15:28:12 от Tarik »

Оффлайн Strange_V

  • Новичок
  • *
  • Сообщений: 46
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #8 : 17 Июня 2010, 16:53:32 »
man kill
man killall

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #9 : 17 Июня 2010, 17:16:55 »
Хочется нормально завершить работу процесса. Там деструкторы есть.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #10 : 17 Июня 2010, 18:44:03 »
Так kill не совсем соответствует своему названию. Он прсылает сигнал заданному процессу, а оный сигнал не тольео не обязательно жёстко завершает этот процесс, но даже вообще его может не завершать. Так что мануал всё же прочитать стоит. А так же man signal для лучшего понимания кухни.

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #11 : 18 Июня 2010, 10:17:22 »
Битва продолжается:
pid=pidof -s PROCESS_NAME
kill -s TERM [$pid]
К сожалению так не работает, потому что pidof выводит результат в консоль, а переменной pid ничего не присваивается.
Как перенаправить вывод...
Проще программу написать, чем возиться с этим шелом...  :idiot2:

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #12 : 18 Июня 2010, 11:19:01 »
killall PROCESS_NAMEне?

Оффлайн Tarik

  • Автор темы
  • Участник
  • *
  • Сообщений: 161
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #13 : 18 Июня 2010, 11:24:20 »
Я тупица. Не могу вообще никак убить процесс.
Вот пример из командной строки:
kill -9 [$(pgrep PROCESS_NAME)]
kill -s TERM [$(pgrep PROCESS_NAME)]
Ругается на отсутствие pid.
Если туда тупо вбить pid, то работает.

pkill пробовал. Ничего не пишет и ничего не делает. :)
Пробовал так:
pkill PROCESS_NAME
killall убивает жестко всех, деструкторы не вызываются. Бред, стопицот функций. Непонятно зачем..

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Вопрос по написанию sh-скрипта
« Ответ #14 : 18 Июня 2010, 11:27:29 »
killall убивает жестко всех, деструкторы не вызываются. Бред, стопицот функций. Непонятно зачем..
кто вам такое сказал? читайте маны
Цитировать
killall - завершить процессы по имени

 

Страница сгенерирована за 0.069 секунд. Запросов: 25.