Запуск файла sh при загрузке машины

bash встроенный pushd с параметрами + и - может вращать стек каталогов. Синтаксис может немного сбивать с толку, возможно, потому, что этот стек представляет собой массив на основе нуля . Эти простые функции-оболочки циклически перемещаются по стеку каталогов:

# cd to next     directory in stack (left  rotate)
ncd(){ pushd +1 > /dev/null ; }
# cd to previous directory in stack (right rotate)
pcd(){ pushd -0 > /dev/null ; }

Тест: устанавливает стек из четырех каталогов.

dirs -c   # clear directory stack
cd /home ; pushd /etc ; pushd /bin ; pushd /tmp

Теперь / tmp - это текущий каталог, а стек выглядит так:

/tmp /bin /etc /home

Перейти к следующему каталогу в стеке (и показать его) четыре раза:

ncd ; pwd ; ncd ; pwd ; ncd ; pwd ; ncd ; pwd

Вывод:

/bin
/etc
/home
/tmp

Перейти в предыдущий каталог в стеке (и показать его) четыре раза:

pcd ; pwd ; pcd ; pwd ; pcd ; pwd ; pcd ; pwd

Вывод:

/home
/etc
/bin
/tmp

Примечание на cd - : Подстановочный знак ответ помог проиллюстрировать, как cd - не использует массив $ DIRSTACK (он использует переменную $ OLDPW ), поэтому cd - не использует ' t effect $ DIRSTACK так же, как и своп на основе стека. Чтобы исправить это, вот простая функция свопа на основе $ DIRSTACK :

scd() { { pushd ${DIRSTACK[1]} ; popd -n +2 ; } > /dev/null ; }

Тест:

dirs -c; cd /tmp; \
pushd /bin; \
pushd /etc; \
pushd /lib; \
pushd /home; \
scd; dirs; scd; dirs

Вывод:

/bin /tmp
/etc /bin /tmp
/lib /etc /bin /tmp
/home /lib /etc /bin /tmp
/lib /home /etc /bin /tmp
/home /lib /etc /bin /tmp

6
18.09.2016, 04:35
6 ответов

Посмотрите на init , который является традиционным стартером процесса и запускает сценарии из папок /etc/init.d , /etc/rc1.d и т. Д. . и /etc/rc.local , что, вероятно, является желаемым местом.

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

В любом случае точные пути могут отличаться в зависимости от дистрибутива, но этого должно быть достаточно, чтобы вы начали.

12
29.04.2021, 00:55

В / etc / inittab найдите строку вида id: 3: initdefault: . Число, вероятно, будет 3 или 5, но может быть 2 или 4. Число в этой строке - уровень выполнения по умолчанию. Скорее всего, это не 2, поэтому ваши скрипты в rc2.d не запустятся.

Поместите ваш сценарий в каталог rcN.d, который соответствует номеру в строке initdefault .

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

Также убедитесь, что ваш скрипт принадлежит пользователю root и имеет права 755 (если вы хотите, чтобы кто-нибудь мог его запустить) или 744.

0
29.04.2021, 00:55

Попробуйте проверить, запускаются ли ваши сценарии (например, но вставив в них touch /var/tmp/startup.script). Все ли команды в ваших сценариях находятся в поисковом патче во время загрузки?

Уровень выполнения 2 мне кажется необычным. 3 должно быть нормально для Linux без графического интерфейса. Какой дистрибутив и версию вы используете?

1
29.04.2021, 00:55

Вы можете использовать cron для этого. Формат

@reboot myjob.sh   

. При необходимости вы можете поместить задание cron в корневой каталог crontab, но, если возможно, поместите его в задание cron пользователя.

0
29.04.2021, 00:55

Добавление скрипта запуска

Этот метод работает с Red Hat, Fedora, Ubuntu (установите пакет chkconfig и сервис), Suse.

Вы должны скопировать ваш скрипт в /etc/init.d (это либо правильный каталог, либо ссылка на правильный каталог, так что это будет работать одинаково)

sudo cp jBossServers.sh /etc/init.d/
sudo chmod 0755 /etc/init.d/jBossServers.sh

Затем вам нужно добавить его в процесс запуска системы. Вместо того, чтобы создавать все необходимые ссылки, используйте chkconfig (сначала установите пакет на Ubuntu)

sudo chkconfig add jBossServers.sh

Теперь, читая заголовок вашего сценария, этот сценарий уже содержит информацию для chkconfig относительно уровней запуска и приоритета. Так что у вас все в порядке. При следующей перезагрузке JBoos будет запущен.

Но вы можете попробовать запустить прямо сейчас

sudo service jBossServers.sh start

Примечание: если ваша система жалуется, что не находит chkconfig или сервис, попробуйте вызвать их с помощью /sbin/. Example

sudo /sbin/chkconfig add jBossServers.sh
sudo /sbin/service jBossServers.sh start
0
29.04.2021, 00:55

Вы можете включить выполнение скрипта при запуске Linux, создав символическую ссылку в /etc/rc.d; является числовым и получается с помощью этой команды (runlevel) Это означает, что уровень выполнения вашей системы Linux.

Например:

# runlevel

вывод:

N 2

Чтобы установить customScript с приоритетом 99:

ln -s /etc/init.d/customScript /etc/rc2.d/S99customScript
  • S ==> start
  • 99 ==> приоритет запуска
0
29.04.2021, 00:55

Теги

Похожие вопросы