bash - 使用脚本保持远程访问运行直到程序结束?
问题描述
我想在 linux 服务器 A 上运行一个程序。Linux 服务器 B 可以监控服务器 A 的功率指标。但是为了测量在服务器 A 上运行的程序,我需要在开始时打开服务器 B 上的测量脚本服务器 A 上的程序,然后在服务器 B 上手动结束。
所以总结一下,如何通过脚本 ssh 进入服务器以运行程序并在之后终止它?
解决方案
这里需要一些技巧。1. 我sshpass
用来通过 ssh 自动输入机器密码(以纯文本形式存储在不安全的脚本中)。2. 我正在这个脚本中编写一个脚本,然后通过 ssh 执行 3. 我将在服务器 A 上运行的程序的 pid 存储在它的 /tmp 目录中
#!/bin/bash
PROGRAM_TO_RUN_ON_SERVER_A="sleep 1000"
PASSWORD_TO_USER_ON_SERVER_A="password"
SERVER_A_USER="user"
SERVER_A_MACHINE_NAME="machine-name"
# Create a local script to run on server A
SCRIPT=/tmp/script.sh
export SSHPASS=${PASSWORD_TO_USER_ON_SERVER_A}
echo '#!/bin/bash' > $SCRIPT
echo "(( ${PROGRAM_TO_RUN_ON_SERVER_A} 0<&- &>/dev/null & echo $! > /tmp/pid.txt) &)" >> $SCRIPT
# Execute script on server A (This also executes your program)
sshpass -e ssh ${SERVER_A_USER}@${SERVER_A_MACHINE_NAME} 'bash -s' < $SCRIPT
# Do server B timing analysis things here
# ...
# ...
# ...
# Kill the program running on server A
sshpass -e ssh ${SERVER_A_USER}@${SERVER_A_MACHINE_NAME} 'cat /tmp/pid.txt | xargs kill -9'
推荐阅读
- java - 您可以使用 ++ 运算符增加长文字并访问 java 中的整个长文字范围吗?
- javascript - 如何获取点击查询的值?
- r - 将拆分数据转换为r中的数据框
- authentication - 如何在 CakePHP 的身份验证插件中更改查找器模型
- reactjs - 使用 IdentityServer4 连接到 AzureAD 而不是直接连接到 AzureAD 有什么好处?
- arrays - 有没有一种有效的方法来比较这些数组?
- dom - Elm 如何制作自定义事件解码器以在鼠标滚轮移动时获取鼠标 x/y 位置
- python - 如何为 += 修复 TypeError 不支持的操作数类型:“DeferredAttribute”和“int”
- java - Eclipse 控制台在运行程序的过程中会自行清除的一些原因是什么?
- mysql - 如何在同一个查询中选择我在上面插入的值?