Oli*_*ons 27 ssh bash shell-script
我正在通过 SSH 启动一个远程脚本,如下所示:
ssh user@ipaddress '~/my_script.sh'
Run Code Online (Sandbox Code Playgroud)
一切正常,但脚本完成后,连接不会关闭。我必须按 CTRL-C 才能断开当前连接。
我试过'~/my_script.sh'中的“exit”命令,但没用。我在“~/my_script.sh”中尝试了“注销”命令,我收到一条消息:
logout: not login shell: use exit
Run Code Online (Sandbox Code Playgroud)
...
知道如何在脚本完成后自动正确关闭 SSH 吗?
(为了澄清而修改:)这是我的脚本中的内容:
#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas
umount_disque_qas()
{
# Umount du disque 'qas' s'il n'avait pas été 'umount' :
nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
if [ "$nom_disque_monte" != "" ]
then
echo "For safety, umount : $nom_disque_monte"
umount $nom_disque_monte
fi
}
# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas
echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."
# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...
echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."
# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."
echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."
echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."
echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3
echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."
echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."
echo "All done"
echo "Click 'Ctrl-C' to quit."
exit
Run Code Online (Sandbox Code Playgroud)
当我通过 SSH 启动它时,它会运行,最后,我读到“全部完成”。所以这意味着它到达最后 2 行。
知道我怎么做才能自动关闭和公关
Wuf*_*ers 21
shell 脚本中的 exit 不起作用,因为它是从脚本中退出,而不是从 shell 中退出。要在脚本完成后退出 shell,请执行以下操作
ssh user@ipaddress '~/my_script.sh && exit'
Run Code Online (Sandbox Code Playgroud)
这将运行脚本,然后退出 shell。
Gil*_*il' 12
ssh 连接在 ssh 启动的进程(此处为 shell)退出时保持打开状态,如果有其他进程仍在使用它。我不知道 ssh 守护进程遵循的确切规则,但至少,如果任何子进程的标准输出仍然连接到 ssh 提供的原始管道,则连接正在使用中。相比:
ssh somehost 'sleep 5 &' # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &' # exits immediately seconds
Run Code Online (Sandbox Code Playgroud)
当你启动一个守护进程时,你应该将它作为后台程序并关闭它的文件描述符。至少,使用这个:
./qaswvd </dev/null >/dev/null 2>/dev/null &
Run Code Online (Sandbox Code Playgroud)
你可能想nohup
在前面加上;它在这里不会有什么不同,但如果脚本是从终端运行的,它会很有用。许多旨在充当守护进程的程序都有一个命令行选项,可以让它们分叉、关闭文件描述符、忽略信号和其他细节。qaswvd
如果有,请查看文档。您还可以研究“守护程序”实用程序。
小智 6
当我搜索相同情况的解决方案时,我看到了这篇文章。尽管解决@Oliver 的问题有点晚了,因为接受的答案显然对 OP 或我都不起作用(不知道为什么它被接受),我仍然想为未来的 googler 发布我自己的解决方案。很简单:-f
在ssh
命令中添加一个选项:
ssh -f user@ipaddress '~/my_script.sh'
Run Code Online (Sandbox Code Playgroud)
-f
option的作用是放在ssh
后台,所以如果没有添加任何进一步的选项,即使连接看起来已经断开,连接也可能仍然有效。如果有兴趣,可以参考本网站另一篇文章中给出的答案。