【问题标题】:start tmux sessions in googlecloud startup-script在谷歌云启动脚本中启动 tmux 会话
【发布时间】:2021-08-24 13:04:59
【问题描述】:

按照文档here 中的建议,我在我的谷歌云实例的元数据中添加了一个启动脚本条目 问题Google Compute Engine - Start tmux with startup-script 对我不起作用。 我的启动脚本代码是:

    #! /bin/bash
    tmux start-server
    tmux new -d -s data_vis_pfs 'pachctl mount /var/data_vis/pfs' 
    tmux new -d -s data_vis_server 'cd /var/data_vis/server/ && python ./index.py' 
    tmux new -d -s data_vis_client 'cd /var/data_vis/client/ && npx serve -l 3001 -s build'

我也试过了:

    #! /bin/bash
    tmux start \; \
         new -d -s data_vis_pfs 'pachctl mount /var/data_vis/pfs' \; \
         new -d -s data_vis_server 'cd /var/data_vis/server/ && python ./index.py' \; \
         new -d -s data_vis_client 'cd /var/data_vis/client/ && npx serve -l 3001 -s build'

当我做sudo journalctl -u google-startup-scripts.service;机器启动后,我得到:

    Aug 24 12:20:40 work1-cpu systemd[1]: Starting Google Compute Engine Startup Scripts...
    Aug 24 12:20:42 work1-cpu GCEMetadataScripts[506]: 2021/08/24 12:20:42 GCEMetadataScripts: Starting startup scripts (version 20201214.00).
    Aug 24 12:20:42 work1-cpu GCEMetadataScripts[506]: 2021/08/24 12:20:42 GCEMetadataScripts: Found startup-script in metadata.
    Aug 24 12:20:42 work1-cpu GCEMetadataScripts[506]: 2021/08/24 12:20:42 GCEMetadataScripts: startup-script exit status 0
    Aug 24 12:20:42 work1-cpu GCEMetadataScripts[506]: 2021/08/24 12:20:42 GCEMetadataScripts: Finished running startup scripts.
    Aug 24 12:20:42 work1-cpu systemd[1]: google-startup-scripts.service: Succeeded.
    Aug 24 12:20:42 work1-cpu systemd[1]: Started Google Compute Engine Startup Scripts.

所以它应该是一场胜利(状态 0)

但是我的代码似乎没有激活(python 服务器没有启动,前面和 pachctl 都没有挂载)。 top 命令也不会显示它们。

我知道我不应该看到由 root 运行的会话,我可以通过 Socket 解决这个问题,但我现在不在乎:我只需要启动代码。 有人知道我错过了什么吗?

【问题讨论】:

  • 啊,我确实在实例中安装了 tmux

标签: bash google-cloud-platform startup tmux startupscript


【解决方案1】:

有各种错误。感谢Wojtek_B 的详细回答,让我找到了方向。

1 - 第一个问题:依赖关系

在我的情况下,我必须在脚本的开头安装所有需要的依赖项:

1.1 - 系统:

sudo apt update 
sudo apt install -y tmux pachctl nodejs npm python3-setuptools python3.7-dev 

1.2 - 蟒蛇:

python3 -m pip install {all packages here....}

由于登录时pip3 list,检索到要安装的软件包列表 注意python3 -m pip 而不是简单的pippip3。如果机器 gcloud 中有 python 2.x 默认使用 2.x 并且因此此安装不起作用(事件 pip3 安装),则使用此选项。无论如何,这python3 -m pip install ... 工作我会建议。

1.3 - 节点

npm install -g npx

2 - Tmux:

tmux start \; \
  new -d -s sleep 'sleep 1'\;  \
  new -d -s data_vis_pfs 'export KUBECONFIG=/var/data_vis/.kub/config && gcloud auth activate-service-account pfsmounter@{PROJECT}.iam.gserviceaccount.com --key-file=/var/data_vis/sa_cred.json &>> /tmp/pfs_log.txt && gcloud container clusters get-credentials {CLUSTER_NAME} --zone={ZONE_NAME} &>> /tmp/pfs_log.txt &&  kubectl config current-context &>> /tmp/pfs_log.txt && pachctl list repo && pachctl mount /var/data_vis/pfs --verbose &>> /tmp/pfs_log.txt' \; \
 new -d -s data_vis_server 'sleep 1 && ls /var/data_vis/pfs/ &>> /tmp/debug1.txt && cd /var/data_vis/server/ && python3 ./index.py &>> /tmp/server_log.txt' \; \
  new -d -s data_vis_client 'cd /var/data_vis/client/ && npx serve -l 3001 -s build &>> /tmp/client_log.txt'
  • 第一次会话睡眠:在我的情况下没有用,但似乎是一种很好的做法,以便脚本不会过早关闭
  • 第二次会议厚皮:
    • 我必须创建一个服务代理(如果不信任此链接,请在 Cloud Console 中转到 service accounts page 或键入 gcloud 服务帐户) 具有以下授权:(对不起,如果不是确切的标签,我必须从我的语言翻译)
      • 集群 Kubernetes Engine 的读取器
      • Kubernetes Engine 的服务代理
      • 阅读器 Kubernetes 引擎
    • 注意{CLUSTER_NAME}{ZONE_NAME}(通过gcloud container clusters list找到它们)和{PROJECT}用你自己的值替换。我必须手动执行 export KUBECONFIG=/var/data_vis/.kub/config 否则它会在 tmux 会话中失败(尽管在主线程中工作)
  • 第三次会议:烧瓶服务器(python):没什么特别的,我睡了以防万一
  • 第四节:前端应用:没什么特别的

最终代码:

sudo apt update 
sudo apt install -y tmux pachctl nodejs npm python3-setuptools python3.7-dev 

python3 -m pip install adal aiohttp ansiwrap anyio appdirs argcomplete argon2-cffi arrow asn1crypto async-generator async-timeout attrs backcall backports.functools-lru-cache bidict binaryornot black bleach blinker blis bokeh boto boto3 botocore brotlipy bz2file cachetools catalogue certifi cffi chardet charset-normalizer click cloudpickle colorama colorcet confuse cookiecutter cryptography cycler cymem dask datashader datashape debugpy decorator defusedxml distributed docker docker-pycreds entrypoints fastai fastcore fastprogress Flask Flask-Cors Flask-SocketIO fsspec gcsfs gitdb GitPython google-api-core google-api-python-client google-auth google-auth-httplib2 google-auth-oauthlib google-cloud-bigquery google-cloud-bigquery-storage google-cloud-bigtable google-cloud-core google-cloud-dataproc google-cloud-datastore google-cloud-firestore google-cloud-kms google-cloud-language google-cloud-logging google-cloud-monitoring google-cloud-pubsub google-cloud-scheduler google-cloud-spanner google-cloud-speech google-cloud-storage google-cloud-tasks google-cloud-translate google-cloud-videointelligence google-cloud-vision google-crc32c google-resumable-media googleapis-common-protos grpc-google-iam-v1 grpcio grpcio-gcp h11 HeapDict holoviews htmlmin httplib2 idna ImageHash imageio importlib-metadata ipykernel ipython ipython-genutils ipython-sql ipywidgets itsdangerous jedi Jinja2 jinja2-time jmespath joblib json5 jsonschema jupyter-client jupyter-core jupyter-http-over-ws jupyterlab jupyterlab-git jupyterlab-pygments jupyterlab-server jupyterlab-widgets kiwisolver kubernetes llvmlite locket loguru Markdown MarkupSafe matplotlib matplotlib-inline missingno mistune msgpack multidict multimethod multipledispatch murmurhash mypy-extensions nbclient nbconvert nbdime nbformat nest-asyncio networkx  numba numpy oauthlib olefile packaging pandas pandas-profiling pandocfilters panel papermill param parso partd pathspec pathy patsy pexpect phik pickleshare Pillow pip poyo preshed prettytable prometheus-client prompt-toolkit protobuf psutil ptyprocess pyarrow pyasn1 pyasn1-modules pycosat pycparser pyct pydantic Pygments PyJWT pynndescent pyOpenSSL pyparsing pyrsistent PySocks python-dateutil python-engineio python-pachyderm python-slugify python-socketio pytz pyviz-comms PyWavelets PyYAML pyzmq rawpy regex requests requests-oauthlib requests-unixsocket retrying rope rsa ruamel.yaml ruamel.yaml.clib s3transfer scikit-image scikit-learn scipy seaborn Send2Trash setuptools shellingham simple-websocket simplejson six smart-open smmap sniffio sortedcontainers spacy spacy-legacy SQLAlchemy sqlparse srsly statsmodels tangled-up-in-unicode tblib tenacity terminado testpath text-unidecode textwrap3 thinc threadpoolctl tifffile toml tomli toolz torch torchvision tornado tqdm traitlets typed-ast typeguard typer typing-extensions umap-learn umap-learn[plot]  Unidecode uritemplate urllib3 visions wasabi wcwidth webencodings websocket-client Werkzeug wheel whichcraft widgetsnbextension wrapt wsproto xarray yarl zict zipp 

#pip3 list &>> /tmp/debug1.txt
npm install -g npx
#nodejs --version &>> /tmp/debug1.txt

tmux start \; \
  new -d -s sleep 'sleep 1'\;  \
  new -d -s data_vis_pfs 'export KUBECONFIG=/var/data_vis/.kub/config && gcloud auth activate-service-account pfsmounter@{PROJECT}.iam.gserviceaccount.com --key-file=/var/data_vis/sa_cred.json &>> /tmp/pfs_log.txt && gcloud container clusters get-credentials {CLUSTER_NAME} --zone={ZONE_NAME} &>> /tmp/pfs_log.txt &&  kubectl config current-context &>> /tmp/pfs_log.txt && pachctl list repo && pachctl mount /var/data_vis/pfs --verbose &>> /tmp/pfs_log.txt' \; \
  new -d -s data_vis_server 'sleep 1 && ls /var/data_vis/pfs/ &>> /tmp/debug1.txt && cd /var/data_vis/server/ && python3 ./index.py &>> /tmp/server_log.txt' \; \
  new -d -s data_vis_client 'cd /var/data_vis/client/ && npx serve -l 3001 -s build &>> /tmp/client_log.txt'

【讨论】:

  • 很高兴听到我能帮上忙 :)
【解决方案2】:

首先 - 根据您运行机器的映像 - 它必须安装 tmux。如果它是 Debian 10 的新机器,您需要在启动脚本的开头输入 sudo apt install tmux -y 来安装它。

要检查脚本是否在开始时运行,您可以在末尾添加touch /tmp/testfile1.txt,并在虚拟机启动时检查文件是否存在。这很容易(而且不是判断脚本是否运行的可靠方法)。

我不熟悉tmux,但我发现服务器服务将退出,因为没有创建会话,在我看来,它就像在建立新会话之前服务器退出。您可以尝试使用sleep 1 suggested here 来解决您的问题。

我尝试按原样运行您的脚本,但结果与您相同,但我进行了我提到的调试并且一切正常;

我在脚本中添加了一些“调试”行并运行它:

apt update && sudo apt install tmux -y &>> /tmp/debug1.txt
tmux start-server  &>> /tmp/debug1.txt && echo "--- Line 1 OK" >>/tmp/debug1.txt
tmux new -d -s data_vis_pfs 'pachctl mount /var/data_vis/pfs'  &>> /tmp/debug1.txt && echo "--- Line 2 OK" >>/tmp/debug1.txt
tmux new -d -s data_vis_server 'cd /var/data_vis/server/ && python ./index.py'  &>> /tmp/debug1.txt && echo "--- Line 3 OK" >>/tmp/debug1.txt
tmux new -d -s data_vis_client 'cd /var/data_vis/client/ && npx serve -l 3001 -s build' &>> /tmp/debug1.txt && echo "--- Line 4 OK" >>/tmp/debug1.txt

我的结果是(我在安装tmux 时删除了一些行):

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libevent-2.1-6 libutempter0

...... removed some lines for better readability ......


Processing triggers for man-db (2.8.5-2) ...
Processing triggers for libc-bin (2.28-10) ...
--- Line 1 OK
--- Line 2 OK
--- Line 3 OK
--- Line 4 OK

结论:您的脚本在虚拟机启动时运行。您只需要弄清楚如何启动 tmux 会话和服务器,然后将其用作启动脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多