【问题标题】:Running process in background after closing terminal关闭终端后在后台运行进程
【发布时间】:2023-08-21 20:55:01
【问题描述】:

即使在关闭终端后,我仍试图在后台运行脚本。我搜索并搜索并尝试了nohupdisown,但似乎都没有工作。当我关闭终端窗口时,我会收到典型的 Closing this window will terminate the running processes: watch. 消息。这最终会终止我的后台进程,即使使用nohupdisown。可能是什么问题?

我的代码是简单的两行代码

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

它位于.bash_profile,因为我希望它在我打开一个新终端时启动。

你可以忽略sudo;我已经找到了一种无需输入密码即可执行 sudo 命令的方法。

我使用的是 Mac OSX。

【问题讨论】:

  • 每次启动新 shell 时都启动一个新进程听起来是个糟糕的主意。
  • @tripleee 我知道这有安全问题。但在我解决这个问题之前,我宁愿先让它工作。在这一点上,我不确定是否可以在关闭终端的后台运行进程。
  • 警告信息似乎来自 OSX 终端应用程序;这当然不是 Bash 的一个特性。尽管有警告,您是否检查过该进程是否仍在运行?如果没有,你知道是什么杀死了它吗?
  • 进程(我定义的cmd)在终端启动后运行。当我尝试关闭终端时,该进程仍在运行。只有在我关闭终端窗口后 cmd 才会停止。我将尝试检查 OSX 终端首选项,看看它是否负责。

标签: macos bash daemon nohup


【解决方案1】:

启动一个子shell 并从那里运行nohup 命令似乎可以避免终端在退出时将其关闭。

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

不是很优雅,但对我有用。

【讨论】:

    【解决方案2】:

    这已经得到解答,但 Screen 实用程序似乎非常适合此问题。

    • 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”的 shell 脚本
    2. 将以下内容放入文件中(我经常使用 textwrangler 和/或 nano)。

      #!/bin/bash
      
      count=0
      
      while [ $count -lt $1 ] ; do 
         echo "Count: $count of $1. 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. 使用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 应该显示与以前相同的屏幕会话。

    我希望这会有所帮助。

    【讨论】:

    • 屏幕很旧。我也是用的,不过很多人转用tmux