4

Я часто хотел записать вывод терминала. Поэтому я попытался установить script для запуска при запуске; в моем файле .bashrc я положил:

script ~/Logs/$(date "+%Y-%m-%d.%H-%M-%S")

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

Однако, поскольку сам script открывает новый терминал во время его выполнения, я вместо этого получил бомбу-вилку:

Last login: Sat May  9 12:02:43 on ttys001
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
[mchenja@mycomp ~]$

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

Если это имеет значение, то это на OS X, хотя я считаю, что то же самое произошло бы в Linux.

3 ответа3

3

Вы должны будете установить свою собственную специальную переменную для проверки в .bash_profile , например,

if [ -z "$IN_MY_SCRIPT" ]
then
    export IN_MY_SCRIPT=$(date)
    script ~/Logs/$(date "+%Y-%m-%d.%H-%M-%S")
fi
1

Я размышлял над ответом @Thomas Dickey через "сторожевую переменную" и вашу ситуацию. Здесь происходят некоторые сложные вещи, и это зависит от вашей среды.

Если вы вошли на рабочую станцию с X windows, при входе в систему читается файл .bash_profile (как правило, хотя я не могу точно сказать обо всех выпусках Linux; это также зависит от вашей оболочки входа в систему). Это запустит ваш сеанс script , так что это плохо. Кроме того, когда вы входите в терминал изнутри X, он не будет читать .bash_profile , а только .bashrc , если вы не скажете программному обеспечению терминала сказать bash, что это оболочка входа в систему, и в этом случае происходит прямо противоположное.

Итак, вот несколько советов:

  • Используйте $ SHLVL, чтобы определить, находитесь ли вы на "верхнем уровне" вызова bash, или, возможно, в сеансе входа в систему X, или, возможно, в терминах / командной строке в X (или, возможно, в консоли!). Вы можете использовать команду tty для различения входа в консоль и входа в терминал (tty |grep -q ^/dev/tty && echo "is console")
  • .bash_profile будет прочитан только один раз за login session в систему ... обычно. Вы также можете форсировать его чтение, вызывая bash с -l .
  • Если это оболочка входа в систему, .bashrc не будет автоматически прочитан. Вы запускаете его, получая его изнутри .bash_profile .
  • Я считаю, что вы хотите убедиться, что script не повторяется. То есть, если вы находитесь в оболочке с запущенным script и создаете вложенную оболочку, вы не хотите, чтобы script запускался снова.
  • Что произойдет, если вы запустите screen в script?
  • screen имеет функцию регистрации, которая может быть более подходящей, чем сценарий. Тогда у вас есть другие проблемы, например, что происходит, когда у вас открыто несколько окон терминала? У каждого из них есть отдельный сеанс экрана?
0

Я отвечаю на вопрос "Предотвратить разветвление" в названии, а не на тот, который вы на самом деле задавали. ;)

Установите жесткие ограничения nproc в /etc/security/limits.conf в соответствии с требованиями PAM.

Просто предложение:

 *        soft   nproc   500
 %users   soft   nofile  256

Но это может просто напортачить с чем-то вроде Apache или MySQL.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .