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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Правильно ли запускать скрипт от самого себя?  (Прочитано 1092 раз)

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

Оффлайн asp2chief

  • Автор темы
  • Активист
  • *
  • Сообщений: 265
    • Просмотр профиля
Есть скрипт:
if ( echo "$RIG" | grep -q "rig" ); then
clear
else
echo "Input user name: "
read USR
useradd -m $USR && passwd $USR
./do.sh
exit 0;
fi

Будет ли работать данный метод запуска скрипта do.sh с последующей командой exit 0; ??? Мне на данном этапе необходимо завершить работу скрипта в секции создания пользователя, а затем запустить новый экземпляр выполнения этого скрипта, а старый завершить..

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Новый скрипт запустится и пока не завершится do.sh не будет выполнено exit 0. Обязательно старый завершать? Подумайте, может пусть пока висит? Ну или отвязывайте с помощью nohup
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Виль

  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
Будет ли работать данный метод запуска скрипта do.sh с последующей командой exit 0; ??? Мне на данном этапе необходимо завершить работу скрипта в секции создания пользователя, а затем запустить новый экземпляр выполнения этого скрипта, а старый завершить..

Судя по скрипту, делать нужно иначе.

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

Можно форкнуть скрипт, как полностью независимый процесс. Это через nohup ./do.sh Но, потеряешь интерактив со скриптом, и вывод из скрипта начнёт записывать в файл в домашнем каталоге. Делают вот так: nohup ./do.sh 1>/dev/null 2>/dev/null , но это тоже без интерактива.

Не знаю решаемую задачу и подробности, сам бы делал примерно по шаблону ниже.

Убери set -e и/или set -x, если они не подходят для тебя; они сильно помогают при дебаге, сохранив скрипт простым, но на экране становится очень шумно. Но, т.к. хочешь вызвать скрипт сам из себя, то это может недорого и сильно облегчить отладку.

Обрати внимание, как сделан вызов job. При таком вызове оно не свалится из-за того, что из job делается return ненуля и включён set -e.

#!/bin/bash

PS4="+:\$0:\$LINENO: "  # Этот текст дописывается в начале строк, которые появляются на экране после включения отладочного вывода через set -x. LINENO есть в Баше, в Sh её нет, например.
set -x  # Показывает выполняемые команды скрипта. При отладке удобно.
set -e  # Включает прерывание скрипта по первой встреченной ошибке. Очень удобно. Внутри функций не используется by design.

need_new_launch=123
all_ok=0

function job {
    local RIG_local="$1"
    if ( echo "$RIG_local" | grep -q "rig" ); then
        clear
    else
        read -p "Input user name: " USR
        useradd -m $USR && passwd $USR
        return $need_new_launch;
    fi
    return $all_ok
}

while true ; do
    echo "Много разной работы скрипта."
    echo "Много работы скрипта."
    job "$RIG" || return_code=$?  # Обход set -e, когда нужно вернуть неноль из job. Оператор "или" ||: или из левой части $? сразу будет ноль, или сработает правая часть, перехватив $? и выполнив операцию, вернувшую ноль (return_code=$? - вернёт ноль и set -e не выстрелит).
    if [ "$return_code" == "$need_new_launch" ] ; then
        read -p "Продолжать? [y/n]" answer
        if [ "${answer,,}" == "y" ] ; then
            continue
        fi
        break
    elif [ "$return_code" == "$all_ok" ] ; then
        exit $all_ok
    else
        break
    fi
done
set +x
echo "Всё!"

 

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