我正在尝试创建一个格式化 Amazon EC2 EBS 卷的脚本,以便我可以挂载它。
从命令行看,它看起来像这样:
> mkfs -q -t ext4 /dev/sdf
/dev/sdf is entire device, not just one partition!
Proceed anyway? (y,n)
Run Code Online (Sandbox Code Playgroud)
(命令是正确的;不需要为我的目的创建分区表)
我的问题:因为这个命令应该在一个自动化脚本中运行,所以我不能在终端上问这个问题;没有人会接听,脚本将挂起。我如何避免这种情况?
我试过:
> echo y | mkfs -q -t ext4 /dev/sdf
Run Code Online (Sandbox Code Playgroud)
但这并不能解决问题。-q 选项也没有区别。
第一次ssh-copy-id会问
# ssh-copy-id -i .ssh/id_dsa.pub backup@example.com
The authenticity of host 'example.com (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is 39:fb:5e:70:30:33:2b:18:17:e9:4f:2f:91:b5:d2:21.
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)
是否可以编写此脚本,因此脚本只会回答是?
如果我做
su - -c 'mkdir bin' user1
Run Code Online (Sandbox Code Playgroud)
然后我得到
su: /usr/bin/ksh: No such file or directory
Run Code Online (Sandbox Code Playgroud)
因为用户 shell 设置为kshin/etc/passwd并且ksh未安装。
题
在这种情况下,如何以用户身份执行命令?
我创建了一个符号链接:
ln -s /tmp/folder1 /tmp/folder2
然后我去 /tmp/folder2 并运行pwd:
$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part
Run Code Online (Sandbox Code Playgroud)
为什么pwdwithsudo给了原目录?我正在编写一个 bash 脚本,需要当前目录的绝对路径。使用 sudo 我似乎无法获得原始目录。
我想显示所有目录,不包含具有特定文件结尾的文件。因此我尝试使用以下代码:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想显示所有不包含结尾的文件的目录.ENDING,但这不起作用。
我的错误在哪里?
我一直无法找到描述此特定场景的问题。
我正在尝试执行一个非常基本的 bash 脚本来检索多台机器的日志记录。我在本地运行脚本,但需要通过 ssh 访问外部机器,以及在该机器上 sudo 进入特权用户...
ssh myuser@machine.net
sudo su - privledged_user
cat logs > file.txt
Run Code Online (Sandbox Code Playgroud)
使用 sh -x 运行它会显示 bash 卡在“ssh”行上。所以我尝试将其修改为:
ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt
Run Code Online (Sandbox Code Playgroud)
这似乎也无限期地停滞了。这个问题有没有更好的解决办法??据我所知,我看不到使用 sudo su 的方法......
谢谢你的帮助!
我有一个相当简单的单元文件,用于我在 CoreOS 上运行的服务器实例的发现助手服务。单元文件如下所示:
[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
while true; do \
export PORT=$(docker port frontend%i 80 | sed s/.*://); \
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
sleep 45; \
done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i
[X-Fleet]
MachineOf=frontend@%i.service
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我花了很长时间才到达这个阶段,因为如果我将etcdctl行更改为:
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Run Code Online (Sandbox Code Playgroud)
然后它不起作用 - 它最终设置了一个100.45.218.3:没有端口的值。一路上,我花了很多时间玩弄$PORT变量的不同用途,但我不知道为什么我选择的配置有效。有一次我在脚本中有这个:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \ …Run Code Online (Sandbox Code Playgroud) 我开始使用supervisord控制服务器中的服务。我不是 linux 的专业用户,但可以很好地使用它并让它运行。
出于好奇,我注意到 supervisord 中的大多数命令似乎都被称为:
[program:install]
command=bash -c "/src/etc/install.sh"
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 bash 的 man,并且知道-c应该使用它来插入在字符串之后传递的变量。
那么bash -c考虑到没有传递/使用变量,在主管(或任何其他地方)中使用而不是直接调用脚本(如下例所示)有什么意义?
[program:install]
command=/src/etc/install.sh
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想要一个 Bash one-liner,如果文件不存在,它会自动创建一个文件。这基本上意味着“如果文件不存在,则创建它”,但要确保没有其他人设法在执行 if 和创建文件之间的小空间中创建文件。
我有一个自动部署工作流,可以将代码推送到我的生产服务器并触发数据库迁移、静态文件更新等。问题是,没有开发选项--reload,gunicorn 不会自动重新加载代码更改,他们建议不要在生产中使用。相反,则指令的发送HUP信号到masterpid。问题是,我不知道如何masterpid在自动脚本中检索,尽管手动操作很容易。
如何materpid在 bash 脚本中检索gunicorn systemd 进程的值?
bash ×10
linux ×6
centos ×2
shell ×2
ubuntu ×2
amazon-ec2 ×1
coreos ×1
deployment ×1
files ×1
gunicorn ×1
sudo ×1
supervisord ×1
systemd ×1