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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Запуск независимой программы из bash  (Прочитано 6950 раз)

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

Оффлайн rvkdw

  • Автор темы
  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Запуск независимой программы из bash
« : 03 Сентября 2012, 19:58:25 »
Хотел написать скрипт, который спрашивает пароль через терминал, после чего окошко терминала должно закрыться, а вместо него запуститься приложение с паролем в качестве аргумента.

Вот этот код не работает (не запускается leafpad):

#!/bin/bash
case $2 in
  "command-line-mode")
    read -s -p "Enter Password: " password
    nohup leafpad &
  ;;
  *)
    gnome-terminal -x "$0" "$1" "command-line-mode"
  ;;
esac

А вот этот работает:

#!/bin/bash
case $2 in
  "command-line-mode")
    read -s -p "Enter Password: " password
    nohup leafpad &
    sleep 1
  ;;
  *)
    gnome-terminal -x "$0" "$1" "command-line-mode"
  ;;
esac

Подскажите пожалуйста в чем моя ошибка, поскольку "рабочий" вариант мне совершенно не нравится, т.к. основан на костыле.

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #1 : 04 Сентября 2012, 10:54:02 »
e вас то и разница в скриптах в одну строку, так что sleep не такой уж и костыль...
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн rvkdw

  • Автор темы
  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #2 : 04 Сентября 2012, 13:35:00 »
Нет никакой гарантии, что "sleep 1" будет помогать во всех случаях запуска команд с & на конце, поэтому костыль тот еще. Вредный и опасный. Программа, по сути, непредсказуема. То, что она во втором варианте работает - не более чем случайное совпадение обстоятельств.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #3 : 04 Сентября 2012, 14:07:28 »
Насколько я понимаю, после запуска  «nohup leafpad»  надо немного подождать, иначе скрипт закончит работу раньше, чем запустится  nohup.  И тогда вместе со скриптом улетит в небытие и  nohup,  и ещё не родившийся  leafpad. Я думаю, именно в этом природа такого поведения. Поможет ли  sleep  во всех случаях — непонятно. Правильно делать так:

1) Запускаем  nohup <процесс> &
2) <процесс>  отправляет сигнал о том, что всё OK.
3) <процесс>  запускает  leafpad
4) Вместо  sleep 1  стоит  <выключатель>  и ждет сигнал.
5) Получив сигнал<выключатель>  заканчивает работу и дальше идет
  ;;
  *)
    gnome-terminal -x "$0" "$1" "command-line-mode"
  ;;
esac


Кажется, что по сравнению с первым вариантом — сплошные костыли, но в этом случае автор может не опасаться, программа должна быть предсказуемой, разве что я что-то неправильно понял.
Делюсь знаниями, но их у меня мало!

Оффлайн rvkdw

  • Автор темы
  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #4 : 04 Сентября 2012, 20:41:37 »
1) Запускаем  nohup <процесс> &
2) <процесс>  отправляет сигнал о том, что всё OK.
3) <процесс>  запускает  leafpad
4) Вместо  sleep 1  стоит  <выключатель>  и ждет сигнал.
5) Получив сигнал<выключатель>  заканчивает работу и дальше идет

Да, ваш вариант решения подойдет. Буду признателен, если подскажете каким кодом это реализовать. У меня весь скрипт запускается внутри gnome-terminal из-за того, что я из этого самого gnome-terminal не могу ничего обратно получить. Не знаю как - stdout он обратно не отдаёт, только stderr. Ведь можно было бы просто запустить gnome-terminal, запросить там пароль и дальше уже делать запуск leafpad'a в основном скрипте без nohup, но я, как ни бился, так и не нашел способа передать какие-либо данные из дочернего субшелла с gnome-terminal в родительский. Единственный вариант, который нашел - использовать named pipe, но передавать пароль через канал, доступный всем желающим, по меньшей мере неправильно. А в вашем варианте он возвращает некий сигнал, который можно поймать. Возможно и пароль можно таким же образом вместо сигнала отправить?
« Последнее редактирование: 04 Сентября 2012, 20:45:15 от rvkdw »

andrey_p

  • Гость
Re: Запуск независимой программы из bash
« Ответ #5 : 05 Сентября 2012, 08:33:22 »
Попробуй так (башизм):

(leafpad &)
и так:

(leafpad &)
wait

Оффлайн rvkdw

  • Автор темы
  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #6 : 05 Сентября 2012, 09:01:07 »
Попробуй так (башизм):

(leafpad &)
и так:

(leafpad &)
wait
Не помогает. Пароль запрашивает, но leafpad после этого не запускается.

andrey_p

  • Гость
Re: Запуск независимой программы из bash
« Ответ #7 : 05 Сентября 2012, 09:06:02 »
Хм... Вот так у меня все срабатывает:

#!/bin/bash
read -s -p "Enter Password: " password
echo
(gvim  &)
wait
echo hi

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #8 : 05 Сентября 2012, 11:03:36 »
А может, вообще по-другому?

# ...

  a=`zenity --password`

#
# Тут проверка
#


  leafpad  # или leafpad &

# ...
Делюсь знаниями, но их у меня мало!

Оффлайн rvkdw

  • Автор темы
  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Запуск независимой программы из bash
« Ответ #9 : 05 Сентября 2012, 11:30:53 »
a=`zenity --password`
Спасибо за подсказку, не знал о zenity. Мою частную проблему запроса пароля это решает полностью.

 

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