我的 Compute Engine 虚拟机在部署时会运行启动脚本。一切似乎都运行良好,但启动脚本中有一个命令我认为有问题。
我运行命令
apt-get update && apt-get upgrade -y
这应该会安装所有软件包的最新版本(对吗?)
当我手动执行此操作时,它可以工作,但需要花费大量时间。如果我让脚本执行此操作,当我通过 ssh 连接时,我看不到任何输出,所以我不得不假设它仍在运行。有没有办法可以查看它是否仍在工作以及是否已完成?
这是脚本:
#! /bin/bash
file="/var/www/check.txt"
if [ -e $file ]
then
apt-get update && apt-get upgrade -y
git -C /var/www/html pull https://xxxxxx:[email protected]/xxxxxx/xxxxx.git
else
apt-get update
apt-get install apache2 php libapache2-mod-php php-mcrypt php-mysql mysql-client -y
a2dismod autoindex
service apache2 restart
cat <<EOF > /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.cgi index.pl index.html index.xhtml index.htm
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
EOF
rm -rf /var/www/html
git clone https://xxxxxx:[email protected]/xxxxxx/xxxxx.git /var/www/html/
cat <<EOF > /etc/apache2/sites-available/xxxxx.conf
<VirtualHost *:80>
ServerName xxxxxx.com
ServerAlias www.xxxxxx.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/wwwroot
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
EOF
cat <<EOF > /etc/apache2/sites-available/020-xxxxx_xxxx.conf
<VirtualHost *:80>
ServerName xxxx.xxxxx.xxx
ServerAlias xxxx
ServerAdmin [email protected]
DocumentRoot /var/www/html/xxxxx
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
EOF
cat <<EOF > /var/www/html/wwwroot/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
EOF
sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
chmod +x cloud_sql_proxy
mkdir /cloudsql; sudo chmod 777 /cloudsql
./cloud_sql_proxy -dir=/cloudsql &
#rm /var/www/html/wwwroot/xxxxx/xxxxxx.php
#temporary for testing.
cat <<'EOF' > /var/www/html/wwwroot/includes/xxxxx.xxxx
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$username = "xxxxxx";
$password = "xxxxx";
$host = "/cloudsql/snappy-gantry-xxxxx:europe-west1:db1";
$dbname = "xxxxx";
setlocale(LC_ALL, 'nld_nld');
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try {
$db = new PDO("mysql:unix_socket={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $ex) {
die("Failed to connect to the database: " . $ex->getMessage());
}
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
EOF
a2dissite 000-default
a2ensite 010-xxxxx_main
a2ensite 020-xxxx_help
a2enmod rewrite
service apache2 restart
apt-get update && apt-get upgrade -y
sudo cat <<EOF > /var/www/check.txt
aanwezig!
EOF
fi
答案1
Google Cloud Compute Engine 实例的启动脚本输出将写入以下之一日志文件取决于实例的 Linux 发行版:
- CentOS 和 RHEL:/var/log/messages
- Debian:/var/log/daemon.log
- Ubuntu 14.04、16.04 和 16.10:/var/log/syslog
- SLES 11 和 12:/var/log/messages
如果出于某种原因您想要存储脚本的更新,您可以考虑将输出重定向到文件并将 ID 上传到 Google Storage。例如:
...
$ command >> output
$ command >> output
$ gsutil cp output gs://yourbucketname/output
$ command >> output
...
$ command >> output
$ gsutil cp output gs://yourbucketname/output
$ ...
请注意,您可能考虑将带有“ ”的标准错误重定向2>>
到文件并将其上传。
编辑:我忘了回答你的一个问题。是的,你可以检查命令是否仍在运行;因为从操作系统的角度来看,这些命令是正常进程,因此你将能够检查它们是否正在运行:
$ ps -aux
例如我得到了这个具有sleep
启动脚本的输出
root 691 0.0 0.0 5840 696 ? S 14:45 0:00 sleep 30
答案2
grep 启动脚本 /var/log/syslog
答案3
对于 RHEL 和 CentOS,你也可以使用 journalctl 命令
$ journalctl
或者如果您想在启动脚本执行时实时跟踪日志,您可以使用 -f 选项:
$ journalctl -f
答案4
从 2022 年起,你可以在 Debian 上使用 journalctl,如下所示
sudo journalctl -u google-startup-scripts.service
看https://cloud.google.com/compute/docs/instances/startup-scripts/linux