5

I want to execute more than one command, in order to the array. を使用して GitHub からデプロイしようとしています。私が現在使用しているコードは以下に含まれています。

async.series([
...
// Deploy from GitHub
function (callback) {
    // Console shizzle:
    console.log('');
    console.log('Deploying...'.red.bold);
    console.log();
    console.log();

    var deployFunctions = [
        {
            command: 'cd ' + envOptions.folder + ' && pwd',
            log: false
        },
        {
            command: 'pwd'
        },
        {
            command: 'su ' + envOptions.user,
            log: false
        },
        {
            command: 'git pull'
        },
        {
            command: 'chmod 0777 * -R',
            log: false
        }
    ];
    async.eachSeries(deployFunctions, function (item, callback) {
        deployment.ssh2.exec(item.command, function (err, stream) {
            deployment.logExec(item);
            stream.on('data', function (data, extended) {
                console.log(data.toString().trim());
                console.log();
            });
            function done() {
                callback(err);
            }

            stream.on('exit', done);
            stream.on('end', done);
        });
    }, function () {
        callback();
    });
},
...);

しかし、正しいディレクトリにcdした後、それがどこにあったかを忘れて、最初からやり直します。

$ cd /some/folder && pwd
/some/folder

$ pwd
/root
4

4 に答える 4

6

@robertklepは、あなたcdが持続しない理由について正しいです。各コマンドは、初期状態で開始する個別のシェル インスタンスを呼び出します。簡単な修正として、各コマンドの前に を付けることもできますcd /home/jansenstok/domains/alcoholtesterwinkel.com/public_html/ &&が、実際には、苦痛に備えて自分自身を設定しています。必要なのは、個々の切断されたコマンドのリストではなく、複数の行のすべての機能を備えたシェル スクリプトです。

ステップ 1 としてssh2 のsftp関数を使用して完全なシェル スクリプトをリモート マシンに転送し、ステップ 2 としてexec( /bin/bash /tmp/your_deploy_script.sh) を介してそれを実行し、ステップ 3 としてスクリプトを削除します。

于 2014-01-03T16:46:53.813 に答える
0

「シェル」コマンドはシステム上の新しい端末を呼び出してジョブを実行するため、プログラムで「シェル」を使用しないでください。"exit" を発行せずに"exec" コマンドを使用する必要があります。デフォルトの「exec」コマンドは、指定したコマンドが実行された後に「exit」コマンドを発行します。

于 2014-07-25T11:43:23.603 に答える