Linux 执行bash脚本和手动执行脚本之间有区别吗?
在过去的两天里,这件事一直发生在我身上。我正试图在SaltStack和一个非常简单的bash脚本的帮助下建立一个subversion存储库 Salt处理这个问题的方法非常简单,它只需将Linux 执行bash脚本和手动执行脚本之间有区别吗?,linux,bash,svn,centos,Linux,Bash,Svn,Centos,在过去的两天里,这件事一直发生在我身上。我正试图在SaltStack和一个非常简单的bash脚本的帮助下建立一个subversion存储库 Salt处理这个问题的方法非常简单,它只需将10subversion.conf从主机移动到minion(从)上的/root/,并安装neded包,如subversion、httpd和mod_dav_svn 发生所有这些之后,将运行下一个脚本: #!/bin/bash mv -f /root/10-subversion.conf /etc/httpd/con
10subversion.conf
从主机移动到minion(从)上的/root/
,并安装neded包,如subversion
、httpd
和mod_dav_svn
发生所有这些之后,将运行下一个脚本:
#!/bin/bash
mv -f /root/10-subversion.conf /etc/httpd/conf.modules.d/10-subversion.conf
mkdir /var/www/svn
svnadmin create /var/www/svn/repo
chown -R apache.apache /var/www/svn/repo
chcon -R -t httpd_sys_content_t /var/www/svn/repo
chcon -R -t httpd_sys_rw_content_t /var/www/svn/repo
systemctl restart httpd
mkdir /mnt/logs
touch /mnt/logs/log
svn checkout http://localhost/svn/repo
svn checkout http://localhost/svn/repo /mnt/logs/
之后,我得到一个错误,svn回购无法加载
svn: E175002: Unable to connect to a repository at URL 'http://localhost/svn/repo'
XML parse error at line 1: no element found (http://localhost/svn/repo)
这里有一件奇怪的事情,这就是问题的原因,如果我单独运行每个命令(我从脚本复制并粘贴到CLI),它就可以工作
那么,仅仅是subversion随机失败,还是执行脚本和手动执行脚本之间存在实际差异
编辑:
不知何故,我试图通过复制和粘贴脚本中的命令来再次执行此操作,但失败了。然后我意识到,在测试它时,我曾经使用编辑器手动修改10 subversion.conf
,但现在我正在移动它,所以我恢复了快照,再次手动编辑文件并工作。我在移动和编辑文件时检查了文件的权限和所有权,两者都相同(如下所示):
可能的解释是,当您尝试运行
svn checkout
时,Web服务器尚未完成重新启动。systemctl restart httpd
命令正在重新启动守护程序,不知道守护程序何时完成初始化,并开始侦听HTTP请求
可能的解决办法:
sleep 10
或类似程序curl
或wget
来“探测”守护进程,直到从get获得成功响应可能的解释是,当您尝试运行
svn checkout
时,Web服务器尚未完成重新启动。systemctl restart httpd
命令正在重新启动守护程序,不知道守护程序何时完成初始化,并开始侦听HTTP请求
可能的解决办法:
sleep 10
或类似程序curl
或wget
来“探测”守护进程,直到从get获得成功响应#!/bin/bash
mv -f /root/10-subversion.conf /etc/httpd/conf.modules.d/10-subversion.conf
mkdir /var/www/svn
svnadmin create /var/www/svn/repo
chown -R apache.apache /var/www/svn/repo
chcon -R -t httpd_sys_content_t /var/www/svn/repo
chcon -R -t httpd_sys_rw_content_t /var/www/svn/repo
systemctl stop httpd &&
systemctl start httpd &&
mkdir /mnt/logs
touch /mnt/logs/log
svn checkout http://localhost/svn/repo
svn checkout http://localhost/svn/repo /mnt/logs/
尝试以下方法:
#!/bin/bash
mv -f /root/10-subversion.conf /etc/httpd/conf.modules.d/10-subversion.conf
mkdir /var/www/svn
svnadmin create /var/www/svn/repo
chown -R apache.apache /var/www/svn/repo
chcon -R -t httpd_sys_content_t /var/www/svn/repo
chcon -R -t httpd_sys_rw_content_t /var/www/svn/repo
systemctl stop httpd &&
systemctl start httpd &&
mkdir /mnt/logs
touch /mnt/logs/log
svn checkout http://localhost/svn/repo
svn checkout http://localhost/svn/repo /mnt/logs/
我终于把它修好了,所以我会把它作为我的答案,因为它帮助了我,但是,如果有人到了这里,请阅读其他的,因为它们非常有用 所以,基本上,我的问题是Selinux。这是移动文件时的上下文:
ls -lahZ /etc/httpd/conf.modules.d/10-subversion.conf
-rw-r--r--。root rootunconfined\u
:object\u r:httpd\u config\u t:s0/etc/httpd/conf.modules.d/10-subversion.conf
这是/etc/httpd/conf.modules.d/
中任何其他文件的上下文:
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 01-cgi.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 10-php.conf
因此,问题在于,我最终解决了
unconfined\u
而不是system\u
,因此我将回答这个问题,因为这对我很有帮助,但如果有人到了这里,请阅读其他问题,因为它们非常有用
所以,基本上,我的问题是Selinux。这是移动文件时的上下文:
ls -lahZ /etc/httpd/conf.modules.d/10-subversion.conf
-rw-r--r--。root rootunconfined\u
:object\u r:httpd\u config\u t:s0/etc/httpd/conf.modules.d/10-subversion.conf
这是/etc/httpd/conf.modules.d/
中任何其他文件的上下文:
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 01-cgi.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 10-php.conf
因此,问题是使用
未定义的
而不是系统
如何运行脚本?执行错误是什么?脚本是通过SaltStack运行的,带有cmd.script
,我在问题上发布的错误应该是相同的。但Exec上下文可能不同。在cron中,有时未设置路径或主路径。Ptty也可以修改行为。该脚本是否与同一用户一起运行?该脚本以root
身份运行,这不是我第一次使用Salt,实际上还有一些脚本正在执行,并且工作正常。是否可能存在一些别名
/bash函数
,它正在重写该脚本中的命令?您可以使用名为svn
的函数,这些函数可以使用一些附加参数或环境在内部调用命令svn
。如何运行脚本?执行错误是什么?脚本是通过SaltStack运行的,带有cmd.script
,我在问题上发布的错误应该是相同的。但Exec上下文可能不同。在cron中,有时未设置路径或主路径。Ptty也可以修改行为。该脚本是否与同一用户一起运行?该脚本以root
身份运行,这不是我第一次使用Salt,实际上还有一些脚本正在执行,并且工作正常。是否可能存在一些别名
/bash函数
,它正在重写该脚本中的命令?您可以使用名为svn
的函数,这些函数可以使用一些附加参数或环境在内部调用命令svn
。我编辑了这篇文章,以防它能带来一些启发。替代wget
:echo-n等待服务器启动。。。;直到nc localhost 80/dev/null;做回显;睡眠0.1;完成
但添加睡眠不会有什么坏处safe@anishsane-仅使用nc
的问题在于,您无法轻松检测到守护进程“启动”但返回非成功响应的情况。回答不错,虽然不是因为这个,但我已经测试过了。我编辑了这篇文章,以防它能带来一些启发。替代wget
:echo-n等待服务器启动。。。;直到nc localhost 80/dev/null;做回显;睡眠0.1;已完成
但添加睡眠不会影响