Назад | Перейти на главную страницу

Как я могу выйти из системы при перезагрузке / остановке по ssh, но так, чтобы их .bash_history сохранялась?

Когда я перезагружаю свой сервер через SSH, сеанс просто зависает, вместо того, чтобы красиво вывести меня из системы, так что я могу продолжать использовать текущий терминал. Я попытался исправить это следующим образом: https://bbs.archlinux.org/viewtopic.php?id=50089 Но тогда моя история bash не сохраняется до перезагрузки.

Есть ли способ красиво выйти из системы всех пользователей (чтобы их история bash сохранялась) перед командой reboot / halt? т.е. сохранить историю bash и сеансы конечного пользователя перед перезагрузкой / остановкой?

ОС: Ubuntu Server 11.04

Вам нужно выполнить что-то вроде history -aв каждой пользовательской сессии. Я не могу придумать "хороший" способ сделать это, но использование PROMPT_COMMAND в bash будет работать, PROMPT_COMMAND - это переменная env для команды, которая выполняется каждый раз, когда bash возвращается к приглашению, то есть автоматически сбрасывает историю в .bash_history при выполнении каждой команды. Работает, но, вероятно, не лучшее решение. Поместите это в .bashrc или в файле profile.d (если вы используете дистрибутив, совместимый с profile.d).

export PROMPT_COMMAND='history -a'

Я нашел решение:

Мне просто нужно было использовать «killall -u» вместо «skill -KILL -u». :) Как указано здесь: http://www.cyberciti.biz/tips/howto-linux-kill-and-logout-users.html , команда "skill" кажется устаревшей, и вместо нее следует использовать другие, такие как pkill и killall. pkill делал не то, что я хочу, а killall делал. :)

Итак, вот полное решение:

1) Создайте скрипт /etc/init.d/killusers, содержащий следующее:

#!/bin/bash
#
# chkconfig: 35 90 12
# description: Foo server
#

# Get function from functions library
#. /etc/init.d/functions
. /lib/lsb/init-functions

# Start the service FOO
start() {
        #initlog -c "echo -n Starting FOO server: "
        #who | cut -d " " -f1 | uniq | xargs killall -u
        #who | cut -d " " -f1 | uniq | xargs skill -KILL -u
        #success $"FOO server startup"
        echo "Do nothing"
}

# Restart the service FOO
stop() {
        #initlog -c "echo -n Stopping FOO server: "
        who | cut -d " " -f1 | uniq | xargs killall -u
        #who | cut -d " " -f1 | uniq | xargs skill -KILL -u
        #who | cut -d " " -f1 | uniq | xargs pkill -STOP -u
}

### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status FOO
        ;;
  restart|reload|condrestart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac

exit 0

(сценарий основан на http://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html )

2) Сделайте его исполняемым:

sudo chmod +x /etc/init.d/killusers

3) Добавьте его в скрипты выключения:

sudo update-rc.d killusers defaults

Примечание 1: я думаю, что уровня запуска 6 должно быть достаточно, но я выбрал значения по умолчанию, чтобы быть уверенным. Сценарий, вероятно, также может содержать команду kill, только если она запускается во время выключения.

Примечание 2: чтобы сразу сохранить историю bash, вы можете использовать (спасибо HampusLi):

history -a

Так что вы также можете просто запустить:

history -a && sudo reboot

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