Как выполнить мой скрипт, но работать в фоновом режиме, чтобы я мог продолжать использовать ту же оболочку

У меня точно такая же надоедливая проблема. Поскольку я не нашел никакого решения, я использую этот простой скрипт bash в качестве обходного пути

#!/usr/bin/bash

while [[ $(dmesg | tail -n 3 | grep ETPS) == "" ]]
do
    sudo modprobe --remove psmouse
    sudo modprobe psmouse
    sleep 3
done

notify-send "Touchback" "Your touchpad is back ready to use"

exit

И, конечно же, было бы неплохо настроить sudoersтак, чтобы он не запрашивал пароль для команды two.

3
13.07.2019, 19:35
4 ответа

Добавьте амперсанд (и )после вашей команды в сценарии оболочки, чтобы запустить сценарий в фоновом режиме, т.е.:

#!/bin/bash
echo "type something"
read text
command $text &

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

Если вы уже запустили скрипт, Ctrl + Z приостановит его, а затем bgвозобновит его, но в фоновом режиме.

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

2
27.01.2020, 21:20

Самый простой способ сделать это — нажать Ctrl + Z(приостановить выполнение скрипта )после того, как вы закончите ввод входных данных, а затем bgкоторый отправит скрипт в фоновом режиме и продолжить его выполнение. Затем вы можете использовать текущий сеанс оболочки в обычном режиме.

Однако лучшим подходом является изменение сценария таким образом, чтобы он не требовал ввода данных пользователем. Просто передайте любой ввод, который вам нужен, в качестве аргументов при запуске скрипта. Это сделает вашу жизнь и жизнь ваших пользователей проще.

Например, вместо этого:

#!/bin/bash
echo "Give me the first number! "
read num1

echo "Give me the second number! "
read num2

Используйте это:

#!/bin/bash
num1=$1
num2=$2

И запустите свой скрипт следующим образом (, где 10и 30— это примеры номеров, которые будут сохранены как num1и num2соответственно):

script.sh 10 30 > out 2>err&

Таким образом, сценарий будет немедленно отправлен в фоновый режим, любой вывод будет перенаправлен в файл с именем out, а все сообщения об ошибках — в файл с именем err. Все параметры были настроены во время запуска, и дальнейшее взаимодействие не требуется.

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

1
27.01.2020, 21:20

Вы не думали открыть еще одно окно оболочки? Я был бы очень удивлен, если бы вам пришлось использовать терминал VT -100 или аналогичный, они уже давно вышли из моды.

0
27.01.2020, 21:20

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

0
27.01.2020, 21:20

Теги

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