mysql - 在屏幕 session 上运行长时间运行的 linux 命令

标签 mysql linux bash

我写了一个 bash 脚本,它包括脚本检查文件大小的部分,如果超过 2GB,它将启动一个屏幕 session 并开始导入数据库转储文件。但是当脚本执行到那个特定部分时,它就不起作用了。意思是,脚本在导入数据库转储之前完成执行。我猜它正在发生,因为屏幕 session 没有等待 db dump import 命令执行完成。脚本看起来不会那么专业,因为我是 shell 脚本的初学者,而且我也不擅长编码,请不要介意。

注意:我已经创建了一个套接字号为 24602 的屏幕 session ,我正在尝试在该 session 中执行 db dump import 命令

脚本

#!/bin/bash

cd /case_data
echo "Conditions:
        1.DB dump file should be there in /case_data/<case number>/ location
        2.DB dump file should end with extension .sql"

        read -p "Please enter a case number for which you need to update the DB file:" casenum


if [[ -z "$casenum" ]] ; then
        echo 'Exiting automation as there is no user INPUT. Hasta La Vista!!'
        return 0

elif [[ ${#casenum} -ne 5 ]]; then
        echo "Error: Case number should contain 5 characters. Please enter the case number again!!"
        return 0

elif [[ $casenum == *['!'@#\$%^\&*()_+]* ]]; then
        echo "Error: Special characters are not allowed. Please enter the case number again!!"
        return 0

elif [ -e "$casenum" ]; then

        echo "Modifying the DB dump file for the case number $casenum"
        cd /case_data/$casenum
        filesize=`du -h --block-size=G *.sql | head -c 1`
       `sed -i '1s/^/SET autocommit=0;\n/' *.sql`
       `echo "COMMIT;" >> *.sql`
        mv *.sql c$casenum.sql
        echo "DB dump file modification completed!!"
        echo "Initiating customer DB dump import to the DB c$casenum"
if [ $filesize -ge 2 ]; then
        echo "Customer DB greater than 2 GB, started a screen session"
        echo "Customer DB import started. Please wait till the import is completed"
        screen -S 24602 -X 'mysql -ss -N -uroot -ppassword -e "use c$casenum;source /case_data/$casenum/c$casenum.sql";'

else
        echo "Customer DB less than 2 GB so skipping screen session!!!"
        echo "Customer DB import started. Please wait till the import is completed"
        mysql -ss -N -uroot -ppassword -e "use c$casenum;source /case_data/$casenum/c$casenum.sql;"
        echo "Customer DB import completed successfully!!!"
fi

else

        echo "Directory does not exist, please check the case number entered"

fi

最佳答案

你误解了“screen -X”。

-X Send the specified command to a running screen session.

这里的specified command是指screen command,是在screen的命令行模式(C-a :)或< strong>screenrc 文件。

screen -S 24602 -X 'mysql ...' 不会工作,因为 mysql 是 bash 外部命令,而不是屏幕命令。

将其替换为 screen -S 24602 -X screen mysql ... 应该可以。 (注意:没有引号。)它将在 session 24602 的新窗口中运行 mysql ...,您可以按 C-a_C-a 切换窗口。

顺便说一句,screen -S 24602 并不意味着“套接字号 24602”,它意味着 session 名称是 24602。

关于mysql - 在屏幕 session 上运行长时间运行的 linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49770031/

相关文章:

c# - MonoDevelop 在 Linux 上错误地报告我的平台

Linux 中的 Java 进程需要初始预热

bash - 有没有办法在不重启终端的情况下通过 bash_profile 到 "resource"?

mysql - 如何为类型为 ='datetime-local' 的 Input 设置最小值和最大值?

mysql - 使用查询的结果进行进一步的计算,这些结果在同一查询中给出错误

MySQL根据字符串的一部分获取数据摘要

linux - 如何阻止鱿鱼中的所有连接

bash - 确保 Kubernetes 部署已完成并且所有 pod 已更新且可用

ruby-on-rails - 为 Rails 应用设置 logrotate

php - jQuery php 从 mysql 动态删除表中的行