Добавьте это к нижней части вашего ~/.bashrc
split_pwd() {
# Only show ellipses for directory trees -gt 3
# Otherwise use the default pwd as the current \w replacement
if [ $(pwd | grep -o '/' | wc -l) -gt 3 ]; then
pwd | cut -d'/' -f1-3 | xargs -I{} echo {}"/../${PWD##*/}"
else
pwd
fi
}
export PS1="\$(split_pwd) > "
. По общему признанию, это, возможно, было бы более чистым, но я хотел получить трещину.
Ожидаемый результат для более трех слоев.
/home/chris/../Node Projects >
Ожидаемый выход для каталогов с рабочего стола и обратно.
/home/chris/Desktop >
/home/chris >
/home
Чтобы остановить остановку при продолжении работы, вы захотите использовать это:
stop on starting rc RUNLEVEL=[016]
Это будет работать, потому что первое, что происходит при вводе «shutdown», - это tunlevel 0 испускается. rc запускается на уровне запуска, а переход из остановленного -> запуска будет полностью блокироваться до тех пор, пока все задания, которые также должны изменить состояние, не завершили это состояние.
Вы хотите, чтобы ваш процесс быстро реагировал на SIGTERM , Если он не ответит в течение 5 секунд, выскочка отправит его SIGKILL. Вы можете поднять это с помощью «kill timeout X».
1 там, кстати, немного сложно, вам нужно убедиться, что ваш запуск включает в себя что-то, начинающееся с уровня запуска [2345] в этот момент, так что пользователь, опустившийся для обслуживания одного пользователя, снова начинает работу. К счастью, большая часть работы пошла на то, чтобы сделать это обычным началом на
start on runlevel [2345]
. Также в некоторых случаях вам нужно что-то продолжать, пока сеть не будет сбита (например, dbus / менеджер). Для этого вы хотите
stop on deconfiguring-networking
Это событие, выпущенное позже при завершении работы, которое также будет заблокировано до тех пор, пока все используемые им работы полностью не завершит свои переходы в состоянии.
Geekosaur, большое спасибо за вашу помощь.
Тем временем я пробовал метод start on runlevel [016], но он не работал, и я думаю, что понимаю, почему:
Задание началось действительно, но процесс завершения работы не был заблокирован, пока задача задания не была завершена. Теперь я совершенно уверен, что события starting и stopping являются единственными событиями, которые могут использоваться в определении задания для блокировки других заданий, и я думаю, что это то, что нам посоветовали руководства Upstart. Поэтому использование события runlevel никогда не приведет к блокировке других заданий или к завершению процесса; Таким образом, это бесполезно для моей цели.
Вместо этого у меня, кажется, есть две возможности:
Следуя одному из ваших предложений, найдите все задания, которые нужны будущим приложениям, и включите все они в стартовом событии для скрипта:start on stopping job1 or stopping job2 or ...
Это так много работы, что я серьезно подумываю о том, чтобы сбросить список заданий и запустить его через sed, чтобы автоматически создать начальную строфу для моей работы, которая включает в себя все задания, которые обычно работают в системе. Преимущество состояло бы в том, что соответствующие приложения будут закрыты, даже если кто-то остановит одно из предварительных условий вручную (в отличие от остановки их изменения / завершения работы / перезагрузки). Найдите одно задание, которое сначала будет остановлено при перезагрузке / выключении системы (давайте назовем это задание «FirstJob») и используем это задание в строфе вроде: start on stopping FirstJob
. Основными недостатками могут быть то, что я не знаю, такая работа существует вообще, и если эта работа действительно зависит от всех других заданий, от которых фактически зависит реальное приложение («в зависимости от другой работы» в этом случае означает «будет полностью остановлено, пока другая работа не начнет останавливаться»). Я не уверен, какая из двух возможностей лучше ...