Disown / background команда, переданная в bash

567
Stephen Smith

TL; DR внизу.

Я пытаюсь сделать простой экран блокировки для моего ноутбука с Arch / BSPWM. Я нашел программу с именем cmatrix, которая имеет флаг заставки, который заставляет ее завершать работу при нажатии клавиши. Я пытаюсь связать вместе команды bspc с cmatrix и vlock, чтобы создать строку, которая может быть запущена для запуска полноэкранного режима cmatrix, запуска vlock при нажатии клавиш, а затем выхода после выхода vlock.

Моя единственная проблема с этим состоит в том, что для того, чтобы экран блокировки был эффективным, мне нужно выйти из sxhkd, чтобы люди не могли просто закрыть окно, содержащее cmatrix / vlock. Я добавил pkill sxhkd в цепочку команд, и это работает. Сломанная часть снова запускает sxhkd. Простое добавление sxhkd в конец не работает, так как окно терминала не закроется, пока sxhkd не завершит работу, что никогда не происходит. Кроме того, если окно терминала закрыто, sxhkd останавливается, потому что он работал в нем.

Я пытался использовать "sxhkd &", но по какой-то причине это не работает.

Вот почти рабочая команда, которую я имею до сих пор:

urxvtc -e bash -c "sleep 0.1; pkill sxhkd; sleep 0.1; bspc window -t fullscreen=on; sleep 0.1; cmatrix -u 9 -s; sleep 0.1; vlock; sleep 0.1; sxhkd"

Команды sleep предназначены для того, чтобы программы не появлялись в неправильном порядке (иногда запрашивается пароль vlock перед запуском cmatrix)

В настоящее время он запускает новое окно urxvt (важно, если я хочу, чтобы мой терминальный шрифт для cmatrix), и он убивает sxhkd, чтобы никто не мог закрыть окно. Он полноэкранный, используя bspc и запускает cmatrix. Когда клавиша нажата, cmatrix завершает работу и появляется запрос пароля vlock. Когда пароль введен правильно, он пытается перезапустить sxhkd, но они остаются связанными.

Любая помощь будет принята с благодарностью!

TL; DR

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

Более простые примеры команд :

urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol" Это должно напечатать привет !, подождите 3 секунды, затем запустите pavucontrol и закройте терминал, оставив pavucontrol. Вместо этого терминал остается открытым, потому что запущен pavucontrol.

urxvtc -e bash -c "echo hello!; sleep 3; pavucontrol &" Это должно напечатать привет !, подождите 3 секунды, затем запустите pavucontrol и закройте терминал, оставив pavucontrol. Однако когда терминал закрывается через 3 секунды, pavucontrol нигде не видно.

1

2 ответа на вопрос

1
Stephen Smith

I seem to have stumbled across the solution when playing with nohup by itself. It seems that nohup doesn't completely release the job from the terminal, so running nohup program & exit doesn't work - the terminal complains that there are running jobs. The easy solution is to add another sleep in between them like so:

nohup command & sleep 2 && exit

The sleep can probably be shortened a bit, but if it's too short it will probably cause the nohupped program to close.

Edit: I'm having some inconsistent behavior with nohup and exit though - sometimes it will exit and leave the program running and sometimes it will complain that there are jobs. I'm not certain why it happens.

0
l0b0

To start and orphan a background process you use nohup my_command &. After that you can exit the starting shell without killing the new process. More on process management.

Используя более простые тестовые команды, я попытался добавить nohup pavucontrol & до конца, что привело к `urxvtc -e bash -c" echo hello !; sleep 3; nohup pavucontrol &; "`. К сожалению, это заставляет всю команду ничего не делать. Кажется, быстро открывается окно терминала, которое закрывается сразу, даже не запуская сон 3. Stephen Smith 9 лет назад 0
Вы не можете использовать `&` * и * `;` для завершения команды. l0b0 9 лет назад 0
Виноват. Кажется, запускаются эхо и сон, но pavucontrol нигде не видно. `urxvtc -e bash -c" echo hello !; sleep 3; nohup pavucontrol & "` Stephen Smith 9 лет назад 0