在 MacOS 上,如果以用户身份启动 brew 服务,则在重启时不会启动

在 MacOS 上,如果以用户身份启动 brew 服务,则在重启时不会启动

gitlab-runner我正在使用 在 MacOS 上安装服务brew install gitlab-runner,之后我可以使用 启动该服务brew services start gitlab-runner。如果我使用 启动该服务sudo(或者从 root 帐户启动),则在重新启动机器后,该服务将启动。

在没有 - 的情况下启动服务时sudo,服务在重启后不会启动。brew services help输出中有一些关于“登录时”的语言,但它在通过 SSH 登录时不起作用,而且 - 我希望服务在启动时启动,即使用户尚未登录。

有什么方法可以让自制的“用户服务”在 MacOS 启动时启动?

使用的问题sudo brew start在于 Gitlab 运行器服务将以启动它的用户的身份运行提交给它的作业 - 并且我需要 Gitlab 作业不以 root 身份运行。

答案1

我在这里做了一个假设,但听起来你希望在gitlab-runner不登录 Mac 上的用户帐户的情况下运行进程。GitLab
目前不支持这一点 -https://docs.gitlab.com/runner/install/osx.html

您需要登录 Mac 上的用户帐户才能以这种方式运行 gitlab-runner。

目前,在 macOS 中唯一可行方法是在用户模式下运行该服务。

GitLab 本身承认它比其他方法“不太安全”,即他们承认你必须关闭 FileVault 并启用自动登录,或者准备在 Mac 关闭或重新启动时手动登录。

答案2

它似乎brew不支持运行“启动守护进程”——它只能管理“启动代理”(苹果的文档深入探讨了“代理”和“守护进程”之间的区别但是,与大多数 Apple 官方文档一样,它没有达到实际规格),这意味着要么在启动时以 root 身份运行,要么在用户登录时以用户身份运行。

但是有一种方法可以让服务在启动时以用户身份运行。我通过以下方法解决了我的问题:

  1. 运行brew services start gitlab-runner(不带sudo)以使 b​​rew 生成~/Library/LaunchAgents/homebrew.mxcl.gitlab-runner.plist定义服务的文件。
  2. 停止服务(brew services stop gitlab-runner
  3. 将文件移动到/Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
  4. 编辑 plist 文件以添加UserName密钥:
  <key>UserName</key>
  <string>myuser</string>
  1. 将文件的所有权更改为root(否则 Launchd 将不会启动它):chown root /Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
  2. 重启

该服务现在将在启动时启动并在守护进程 plist 文件中指定的用户帐户下运行。

示例用例

在我的用例中,我使用 AWS mac1.metal“VM”来运行 Gitlab 运行器,并且通过将 EC2“用户数据”字段设置为可以设置 Gitlab 运行器并自动启动它的 bash 脚本来设置初始化脚本,它看起来像这样:

#!/bin/bash
GITLAB_TOKEN=GET_THE_CI_TOKEN_FROM_SOMEWHERE
# this script runs as root, so to use brew we need to run
# a script as ec2-user:
cat > /usr/local/bin/setup-ci.sh <<<'#!/bin/bash -x
    source .bash_profile
    brew upgrade
    brew update --auto-update
    brew install rbenv gitlab-runner
    rbenv init - bash >> .bash_profile
    source .bash_profile
    rbenv install 2.7.4
    rbenv global 2.7.4
    brew services start gitlab-runner
    sleep 10 # let the service settle before registering
    gitlab-runner register --non-interactive --url https://gitlab.com --registration-token "'"${GITLAB_TOKEN}"'" --executor shell --name mac-gitlab-runner --tag-list macos,ios --shell bash
    sleep 3
    cat /Users/ec2-user/.gitlab-runner/config.toml # for debugging
    # update the plist file
    perl -lpe "m,RunAtLoad, and print \"\t<key>UserName</key><string>ec2-user</string>\"" ~/Library/LaunchAgents/homebrew.mxcl.gitlab-runner.plist > homebrew.mxcl.gitlab-runner.plist
    sudo mv homebrew.mxcl.gitlab-runner.plist /Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
    sudo /usr/sbin/chown root /Library/LaunchDaemons/homebrew.mxcl.gitlab-runner.plist
    # Try to stop service - it sometimes "fails", but we dont care about that
    brew services stop gitlab-runner || true
'
chmod 755 /usr/local/bin/setup-ci.sh
su - ec2-user -c /usr/local/bin/setup-ci.sh

启动完成后,我重新启动 EC2 实例,Gitlab runner 自动启动,并以 的身份运行ec2-user

相关内容