2017-01-29 8 views
-1

Я этот сценарий, который должен начать Keep-Alive сценарий и Sublime Text 3 под Bash для Windows:убить фоновый процесс на SIGINT

#!/bin/dash 

set -e 

# Keep alive (in background) 
tail -f /dev/null & 
pid=$! 

echo "tail process id: ${pid}" 
echo "Keep-alive process started with Sublime Text 3\nPress SIGINT (CTRL+C) to kill it..." 

# Start Sublime Text 3 
DISPLAY=localhost:0 /usr/bin/sublime 

# http://stackoverflow.com/a/19274804/1442219 
trap "kill ${pid}; exit 1" INT 
wait 

Этот код генерирует:

tail process id: 49 
Keep-alive process started with Sublime Text 3 
Press SIGINT (CTRL+C) to kill it... 
tail: cannot determine location of '/dev/null'. reverting to polling: Invalid argument 

Все цель этого скрипта, что я запускаю Sublime Text 3 с графическим интерфейсом с сервером Xorg под Bash для Windows. Я пытаюсь сделать ярлык для запуска этого сценария с "C:\Windows\System32\bash.exe" -c "./my-script.sh" команды и Bash для Windows, должно работать в фоновом режиме, когда я использую ST3, так как в противном случае есть dbus ошибки (даже если вы изменили /etc/dbus-1/session.conf)

Проблемы: если Я нажимаю CTRL+C, tail Процесс все еще отображается в фоновом режиме.

Edit:

Я изменил порядок в сценарии, металлообрабатывающая tail и wait под всем.

Решено:

Похоже dash не поддерживает SIGINT или INT. Решение должно использовать bash, а SIGINT будет работать так, как должно.

+1

Дэш не Баш. – 123

+0

Возможный дубликат [Как убить фоновые процессы/задания при выходе моего сценария оболочки?] (Http://stackoverflow.com/questions/360201/how-do-i-kill-background-processes-jobs-when-my -shell-script-exits) – jww

+1

Ваша команда 'wait' заставляет сценарий приостанавливаться и ждать завершения всех фоновых заданий. Поэтому ваша команда 'tail' должна завершиться до запуска команды' sublime'. Это ваше намерение? Что касается проблемы с 'tail', возможно, вы могли бы попробовать использовать' sleep' с очень большой продолжительностью? – Fred

ответ

0

Похоже, dash не поддерживает SIGINT или INT (по крайней мере, это относится к подсистеме Linux для Windows). Решение должно использовать bash, а SIGINT будет работать так, как должно.

sublime.sh:

#!/bin/bash 

set -e 

# Just to make sure, this line takes PID1 in Docker environments 
# So SIGINT/SIGKILL won't be blocked 
echo "pid1" > /dev/null 

echo -e "\n///////////////////////////////////////////////\n" 

# Keep alive (in background) hack from Docker environments 
tail -f /dev/null & 
pid[0]=$! 

echo "tail process id: ${pid[0]}" 
echo -e "Keep-alive process started with Sublime Text 3\nPress SIGINT (CTRL+C) to kill it..." 

# Start Sublime Text 3 
DISPLAY=localhost:0 /usr/bin/sublime 

# http://stackoverflow.com/a/19274804/1442219 
# http://stackoverflow.com/a/360275/1442219 
trap "kill ${pid[0]}; exit 1" SIGINT 

echo -e "\n///////////////////////////////////////////////\n" 

wait 

sublime.cmd

@ECHO OFF 
"C:\Windows\System32\bash.exe" -c "./sublime.sh" 

 Смежные вопросы

  • Нет связанных вопросов^_^