我编写了一个bash脚本,它包含一个脚本检查文件大小的部分,如果它超过2GB,那么它将启动一个屏幕会话并开始导入数据库转储文件。但是当脚本执行到达特定部分时,它就无法正常工作。意味着,脚本在导入db dump之前完成执行。我猜它正在发生,因为屏幕会话不等待db dump import命令执行完成。脚本看起来不那么专业,因为我是shell脚本的初学者,而且我也不擅长编码,请不要介意。
注意:我创建了一个套接字号为24602的屏幕会话,我正在尝试在该会话中执行db dump import命令
SCRIPT
#!/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
答案 0 :(得分:0)
你误解了'screen -X
'。
-X将指定的命令发送到正在运行的屏幕会话。
指定命令在这里表示屏幕命令,这是在屏幕的命令行模式(Ca:)或<中使用的命令strong> screenrc 文件。
screen -S 24602 -X 'mysql ...'
无效,因为mysql
是bash外部命令,而不是屏幕命令。
将其替换为screen -S 24602 -X screen mysql ...
应该有效。 (注意:没有引号。)它将在会话24602的新窗口中运行mysql ...
,您可以点击C-a_C-a切换窗口。
BTW,screen -S 24602
并不代表'套接字号24602',它意味着会话名称是24602。