Запуск процесса в фоновом режиме после закрытия терминала

Я пытаюсь запустить скрипт в фоновом режиме, даже после закрытия терминала. Я искал, искал и пытался!--1--> и disown но ни один из них не работает. Когда я закрываю окно терминала, я получаю типичное Closing this window will terminate the running processes: watch. сообщение. Это заканчивается завершением моего фонового процесса, даже при использовании nohup или disown. В чем может быть проблема?

мой код представляет собой простые две строки

cmd="nohup watch -n 1 sudo /etc/block.sh > /dev/null"
$cmd & # blocks automatically  

он расположен в .bash_profile, потому что я хочу, чтобы это начать всякий раз, когда я открываю новый терминал.

вы можете игнорировать sudo; я уже нашел способ выполнить команду sudo без ввода пароля.

Я использую Mac OSX.

2 ответов


запуск подрешетки и запуск nohup команда оттуда, кажется, избегает того, чтобы терминал убил его при выходе.

bash -c "nohup sh -c 'while true; do date; sleep 1; done' &"

не очень элегантно, но работает для меня.


на это уже ответили, но утилита экрана кажется, что это было бы идеально для этого.

  • man screen для просмотра документации для экрана.

  • www.ss64.com/osx/screen.html для просмотра немного более удобной документации.

  • начальный экран с именем и сценарием для запуска:

    screen -S GWatch Scripts/gw_watch.sh
    This starts a screen session named 'GWatch' and executes gw_watch.sh.
    

при запуске сеанса экрана есть возможность отключения от него. Этот оставит экран активным в фоновом режиме. Он будет оставаться активным даже после выхода пользователя из системы (несмотря на разрешения).

вот пример:

  1. создать скрипт, названный 'screencheck.sh'
  2. поместите в файл следующее (Я часто использую textwrangler и / или nano).

    #!/bin/bash
    
    count=0
    
    while [ $count -lt  ] ; do 
       echo "Count: $count of . Pausing for five seconds."
       sleep 5s
       ((count++))
    done
    
  3. открыть два окна терминала.

  4. в одном из окон терминала введите screen -ls. Вы должно появиться сообщение об отсутствии сокетов.
  5. во втором окне терминала измените каталог, в котором был сохранен скрипт.
  6. во втором окне терминала screen -S ScreenCheck screencheck.sh 500. screencheck.sh должен быть исполняемым.
  7. во втором окне терминала вы должны увидеть:

    Count: 0 of 500. Pausing for five seconds.
    Count: 1 of 500. Pausing for five seconds.
    Count: 2 of 500. Pausing for five seconds.
    ...
    
  8. отключитесь от сеанса экрана, набрав ctrl-a d. Это control + a, отпустите оба, D ключ.
  9. вы должны увидеть [detached].
  10. в первом терминале введите screen -ls.
  11. вы должны увидеть что-то вроде:

    FCH000: ~: screen -ls
    There is a screen on:
       1593.ScreenCheck (Detached)
    1 Socket in /var/folders/pk/l6b5fhkj6mxfpfh8mtgmstg40000gn/T/.screen.
    
  12. Reattach к сеансу экрана с помощью screen -R ScreenCheck.

  13. вы должны увидеть что-то вроде:

    Count: 226 of 500. Pausing for five seconds.
    Count: 227 of 500. Pausing for five seconds.
    Count: 228 of 500. Pausing for five seconds.
    Count: 229 of 500. Pausing for five seconds.
    ...
    

чтобы увидеть, работает ли он после выхода из системы, выйдите из системы и ssh на компьютер с другого компьютера. screen -ls должен показывать тот же сеанс экрана, что и до.

надеюсь, это поможет.