通过Bash脚本远程执行和放弃进程?

时间:2019-02-18 20:52:48

标签: bash shell

我有一个在Raspberry Pi上执行的Python程序,但是我通过SSH执行它。我想编写一个简单的Bash脚本,使我可以双击它并执行启动,包括:SSH进入Pi,cd进入目录,执行python文件并发送到后台,然后使用disown -h使其能够在不依赖于保持SSH连接正常的情况下运行。我使用sshpass是为了简化操作,这是我到目前为止所拥有的,但是在运行它时,终端会冻结,进程会运行,但是,我知道我的程序无法启动。我尝试过的事情出了什么问题以及如何实现自己的目标?

#!/bin/bash

$(
sshpass -p [MyPass] ssh pi@[MyIP]
"
cd Documents/MyProgram/;
python3 myFile.py &;
disown -h
"
)

请原谅我的格式。

2 个答案:

答案 0 :(得分:2)

sshpass可能会挂起密码验证。最安全的方法是使用ssh-copy-id将私钥复制到远程主机,然后使用常规的ssh命令 对于没有密码通过ssh登录:

ssh-keygen
ssh-copy-id user@host

然后只使用ssh

ssh user@host "nohup python3 myFile.py 2>&1 > /dev/null &;exit;"

您可以使用nohup

nohup python3 myFile.py 2>&1 > /dev/null &

答案 1 :(得分:2)

如果进程仍在本地TTY上具有句柄,则无法有效地放弃该进程。使用重定向来阻止它们:

ssh pi@"$myIP" bash -s <<'EOF'
  cd Documents/MyProgram/ || exit
  python3 myFile.py </dev/null >/dev/null 2>&1 &
  disown -h
EOF

重定向到文件同样有效-目标是覆盖SSH会话的stdin,stdout和stderr的句柄; /dev/null并不是那么重要。