Когда я перезагружаю свой сервер через 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
Но я хотел, чтобы он работал для любого пользователя и без необходимости создавать псевдоним, скрипт или что-то подобное.