1

When i run apache50 start ~/workspace/pset7/public, i get the following errors:

/etc/init.d/apache2: 71: /etc/profile.d/ide50.sh: Syntax error: "(" unexpected
/etc/init.d/apache2: 71: /etc/profile.d/ide50.sh: Syntax error: "(" unexpected
ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars
Setting Apache's document root to /home/ubuntu/workspace/pset7/public ...
/etc/init.d/apache2: 71: /etc/profile.d/ide50.sh: Syntax error: "(" unexpected
/etc/init.d/apache2: 71: /etc/profile.d/ide50.sh: Syntax error: "(" unexpected
ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars
Apache failed to start!

How do i get to the directory with the Syntax error to try and correct it? Or get to the APACHE_PID_FILE?

I've run 'update50', 'killall -9 server' and set up all the chmod commands as per the pset instructions

Thanks!

EDIT

Files requested: ide50.sh

# set maximum file size to 512MB
 ulimit -f 524288

 # disable auto-logout
 export TMOUT=0

 # suppress this error for now: /home/jharvard/.dropbox-dist/libz.so.1: version `ZLIB_1.2.3.3' not found (required by /usr/lib/libxml2.so.2) F$
 # http://forums.dropbox.com/topic.php?id=48321 http://forums.dropbox.com/topic.php?id=19439
 alias dropbox="dropbox 2> /dev/null"

 # if not root
 if [ "$(id -u)" != "0" ]; then

   # set umask
   umask 0077

   # enable commands installed in /opt/cs50/bin
   case ":$PATH:" in
       *:/opt/cs50/bin:*)
           : ;;
       *)
           export PATH=/opt/cs50/bin:$PATH ;;
   esac

   # enable commands installed in $HOME/.local/bin
   case ":$PATH:" in
       *:$HOME/.local/bin:*)
           : ;;
       *)
           export PATH=$PATH:$HOME/.local/bin ;;
   esac

   # configure clang
   export CC=clang
   export CFLAGS="-fsanitize=integer -fsanitize=undefined -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wshadow"
   export LDLIBS="-lcrypt -lcs50 -lm"

   # protect user
   alias cp="cp -i"
   alias mv="mv -i"
   alias rm="rm -i"

   # suppress gdb's startup output
   alias gdb="gdb -q"

   # unconditionally make all targets
   alias make="make -B"

   alias apachectl='echo "Please use apache50 instead!"'
   alias mysql-ctl='echo "Please use mysql50 instead!"'
   alias phpmyadmin-ctl='echo "Please use mysql50 instead!"'

   # shift out and in of block character palettes
   alias break50="printf '\x0e'"
   alias fix50="printf '\x0f'"

   fi

 # python3
 alias python=python3
 alias pip=pip3
 export PYTHONDONTWRITEBYTECODE=1

 # sqlite3
 alias sqlite3="sqlite3 -column -header"

 # flask
 export FLASK_APP=application.py
 export FLASK_DEBUG=1

 function flask()
 {
     if [[ "$1" == "run" ]]; then
     command flask run --host=0.0.0.0 --port=8080 --with-threads "${@:2}"
     else
     command flask "$@"
     fi
 }   

 # valgrind defaults
 export VALGRIND_OPTS="--memcheck:leak-check=full --memcheck:track-origins=yes"

 # set editor
 export EDITOR=nano

 # set locale
 export LANG=C

 # Node.js
 export NODE_ENV=dev

 # web application environment
 export APPLICATION_ENV=dev
 export APPLICATION_ENV=dev

apache2

 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides:          apache2
 # Required-Start:    $local_fs $remote_fs $network $syslog $named
 # Required-Stop:     $local_fs $remote_fs $network $syslog $named
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # X-Interactive:     true
 # Short-Description: Start/stop apache2 web server
 # Description:       Start the web server and associated helpers
 #  This script will start apache2, and possibly all associated instances.
 #  Moreover, it will set-up temporary directories and helper tools such as
 #  htcacheclean when required by the configuration.
 ### END INIT INFO

 DESC="web server"
 NAME=apache2
 DAEMON=/usr/sbin/$NAME

 SCRIPTNAME="${0##*/}"
 SCRIPTNAME="${SCRIPTNAME##[KS][0-9][0-9]}"
 if [ -n "$APACHE_CONFDIR" ] ; then
     if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
             DIR_SUFFIX="${APACHE_CONFDIR##/etc/apache2-}"
     else
             DIR_SUFFIX=
     fi
 elif [ "${SCRIPTNAME##apache2-}" != "$SCRIPTNAME" ] ; then
     DIR_SUFFIX="-${SCRIPTNAME##apache2-}"
     APACHE_CONFDIR=/etc/apache2$DIR_SUFFIX
 else
     DIR_SUFFIX=
     APACHE_CONFDIR=/etc/apache2
 fi
 if [ -z "$APACHE_ENVVARS" ] ; then
     APACHE_ENVVARS=$APACHE_CONFDIR/envvars
 fi
 export APACHE_CONFDIR APACHE_ENVVARS

 ENV="env -i LANG=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 if [ "$APACHE_CONFDIR" != /etc/apache2 ] ; then
     ENV="$ENV APACHE_CONFDIR=$APACHE_CONFDIR"
 fi
 if [ "$APACHE_ENVVARS" != "$APACHE_CONFDIR/envvars" ] ; then
     ENV="$ENV APACHE_ENVVARS=$APACHE_ENVVARS"
 fi


 #edit /etc/default/apache2 to change this.
 HTCACHECLEAN_RUN=auto
 HTCACHECLEAN_MODE=daemon
 HTCACHECLEAN_SIZE=300M
 HTCACHECLEAN_DAEMON_INTERVAL=120
 HTCACHECLEAN_PATH=/var/cache/apache2$DIR_SUFFIX/mod_cache_disk
 HTCACHECLEAN_OPTIONS=""

 # Read configuration variable file if it is present
 if [ -f /etc/default/apache2$DIR_SUFFIX ] ; then
     . /etc/default/apache2$DIR_SUFFIX
 elif [ -f /etc/default/apache2 ] ; then
     . /etc/default/apache2
 fi

 PIDFILE=$(. $APACHE_ENVVARS && echo $APACHE_PID_FILE)

 VERBOSE=no
 if [ -f /etc/default/rcS ]; then
     . /etc/default/rcS
 fi
 . /lib/lsb/init-functions


 # Now, set defaults:
 APACHE2CTL="$ENV apache2ctl"
 HTCACHECLEAN="$ENV htcacheclean"
 PIDFILE=$(. $APACHE_ENVVARS && echo $APACHE_PID_FILE)
 APACHE2_INIT_MESSAGE=""

 CONFTEST_OUTFILE=
 cleanup() {
     if [ -n "$CONFTEST_OUTFILE" ] ; then
         rm -f "$CONFTEST_OUTFILE"
     fi
 }   
 trap cleanup 0  # "0" means "EXIT", but "EXIT" is not portable


 apache_conftest() {
     [ -z "$CONFTEST_OUTFILE" ] || rm -f "$CONFTEST_OUTFILE"
     CONFTEST_OUTFILE=$(mktemp)
     if ! $APACHE2CTL configtest > "$CONFTEST_OUTFILE" 2>&1 ; then
         return 1
     else
         rm -f "$CONFTEST_OUTFILE" 
         CONFTEST_OUTFILE=
         return 0
     fi  
 }       

 clear_error_msg() {
     [ -z "$CONFTEST_OUTFILE" ] || rm -f "$CONFTEST_OUTFILE"
     CONFTEST_OUTFILE=
     APACHE2_INIT_MESSAGE=
 }   

 print_error_msg() {
     [ -z "$APACHE2_INIT_MESSAGE" ] || log_warning_msg "$APACHE2_INIT_MESSAGE"
     if [ -n "$CONFTEST_OUTFILE" ] ; then
         echo "Output of config test was:" >&2
         cat "$CONFTEST_OUTFILE" >&2
         CONFTEST_OUTFILE=
     fi
 }

 apache_wait_start() {
     local STATUS=$1
     local i=0
     while : ; do
             PIDTMP=$(pidofproc -p $PIDFILE $DAEMON)
             if [ -n "${PIDTMP:-}" ] && kill -0 "${PIDTMP:-}" 2> /dev/null; then
                     return $STATUS
             fi

             if [ $i = "20" ] ; then
                     APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX instance did not start within 20 seconds. Please read the log files to discover problems"
                     return 2
             fi

             [ "$VERBOSE" != no ] && log_progress_msg "."
             sleep 1
             i=$(($i+1))
     done
 }

 apache_wait_stop() {
     local STATUS=$1

     PIDTMP=$(pidofproc -p $PIDFILE $DAEMON)
     if [ -n "${PIDTMP:-}" ] && kill -0 "${PIDTMP:-}" 2> /dev/null; then
             local i=0
             while kill -0 "${PIDTMP:-}" 2> /dev/null;  do
                     if [ $i = '60' ]; then
                             break
                             STATUS=2
                     fi
                     [ "$VERBOSE" != no ] && log_progress_msg "."
                     sleep 1
                     i=$(($i+1))
             done
             return $STATUS
     else
         return $STATUS
     fi
 }


 #
 # Function that starts the daemon/service
 #
 do_start()
 {
     # Return
     #   0 if daemon has been started
     #   1 if daemon was already running
     #   2 if daemon could not be started

     if pidofproc -p $PIDFILE "$DAEMON" > /dev/null 2>&1 ; then
             return 1
     fi

     if apache_conftest ; then
             $APACHE2CTL start
             apache_wait_start $?
             return $?
     else    
             APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed."
             return 2
     fi
 }           

 #   
 # Function that stops the daemon/service
 #
 do_stop()
 {
     # Return
     #   0 if daemon has been stopped
     #   1 if daemon was already stopped
     #   2 if daemon could not be stopped
     #   other if a failure occurred

     # either "stop" or "graceful-stop"
     local STOP=$1
     # can't use pidofproc from LSB here
     local AP_RET=0

     if pidof $DAEMON > /dev/null 2>&1 ; then
             if [ -e $PIDFILE ] && pidof $DAEMON | tr ' ' '\n' | grep -w $(cat $PIDFILE) > /dev/null 2>&1 ; then
                     AP_RET=2
             else
                     AP_RET=1
             fi
     else
         AP_RET=0
     fi

     # AP_RET is:
     # 0 if Apache (whichever) is not running
     # 1 if Apache (whichever) is running
     # 2 if Apache from the PIDFILE is running

     if [ $AP_RET = 0 ] ; then
             return 1
     fi

     if [ $AP_RET = 2 ] && apache_conftest ; then
             $APACHE2CTL $STOP > /dev/null 2>&1
             apache_wait_stop $?
             return $?
     else    
             if [ $AP_RET = 2 ]; then
                     clear_error_msg
                     APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed, so we are trying to kill it manually. This is almost certainly suboptimal, so please make sure your system is working as you'd expect now!"
                     killproc -p $PIDFILE $DAEMON
                     apache_wait_stop $?
                     return $?
             elif [ $AP_RET = 1 ] ; then
                     APACHE2_INIT_MESSAGE="There are processes named 'apache2' running which do not match your pid file which are left untouched in the name of safety, Please review the situation by hand".
                     return 2
             fi
     fi              

 }           


 #           
 # Function that sends a SIGHUP to the daemon/service
 #                   
 do_reload() {
     if apache_conftest; then
             if ! pidofproc -p $PIDFILE "$DAEMON" > /dev/null 2>&1 ; then
                     APACHE2_INIT_MESSAGE="Apache2 is not running"
                     return 2
             fi
             $APACHE2CTL graceful > /dev/null 2>&1
             return $?
     else    
             APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed. Not doing anything."
             return 2
     fi
 }           


 check_htcacheclean() {
     [ "$HTCACHECLEAN_MODE" = "daemon" ] || return 1
     [ "$HTCACHECLEAN_RUN"  = "yes"    ] && return 0

     MODSDIR=$(. $APACHE_ENVVARS && echo $APACHE_MODS_ENABLED)
             [ "$HTCACHECLEAN_RUN"  = "auto" \
                     -a -e ${MODSDIR:-$APACHE_CONFDIR/mods-enabled}/cache_disk.load ] && \
                     return 0
     return 1
}                   

 start_htcacheclean() {
        $HTCACHECLEAN $HTCACHECLEAN_OPTIONS -d$HTCACHECLEAN_DAEMON_INTERVAL \
             -i -p$HTCACHECLEAN_PATH -l$HTCACHECLEAN_SIZE
 }

 stop_htcacheclean() {
     pkill -P 1 -f "htcacheclean.* -p$HTCACHECLEAN_PATH " 2> /dev/null || return 1
 }      


 # Sanity checks. They need to occur after function declarations
 [ -x $DAEMON ] || exit 0

 if [ ! -x $DAEMON ] ; then
     echo "No apache-bin package installed"
     exit 0
 fi

 if [ -z "$PIDFILE" ] ; then
     echo ERROR: APACHE_PID_FILE needs to be defined in $APACHE_ENVVARS >&2
     exit 2
 fi

 if check_htcacheclean ; then
     if [ ! -d "$HTCACHECLEAN_PATH" ] ; then
             echo "htcacheclean is configured, but directory $HTCACHECLEAN_PATH does not exist!" >&2
             exit 2
     fi
 fi



 case "$1" in
   start)
     log_daemon_msg "Starting $DESC" "$NAME"
     do_start
     RET_STATUS=$?
     case "$RET_STATUS" in
         0|1)
             log_success_msg
             [ "$VERBOSE" != no ] && [ $RET_STATUS = 1 ] && log_warning_msg "Server was already running"
             if check_htcacheclean ; then
                 [ "$VERBOSE" != no ] && log_daemon_msg "Starting HTTP cache cleaning daemon" "htcacheclean"
                 start_htcacheclean
                 [ "$VERBOSE" != no ] && log_end_msg $?
             fi
             ;;
         2)
             log_failure_msg
             print_error_msg
             exit 1
             ;;
     esac
     ;;
   stop|graceful-stop)
     log_daemon_msg "Stopping $DESC" "$NAME"
     do_stop "$1"
     RET_STATUS=$?
     case "$RET_STATUS" in
         0|1)
             log_success_msg
             [ "$VERBOSE" != no ] && [ $RET_STATUS = 1 ] && log_warning_msg "Server was not running"
             ;;
         2)
             log_failure_msg
             print_error_msg
             exit 1
             ;;
     esac
     print_error_msg

     if check_htcacheclean ; then
         [ "$VERBOSE" != no ] && log_daemon_msg "Stopping HTTP cache cleaning daemon" "htcacheclean"
         stop_htcacheclean
         [ "$VERBOSE" != no ] && log_end_msg $?
     fi

     ;;
   status)
     status_of_proc -p $PIDFILE "apache2" "$NAME"
     exit $?
     ;;
   reload|force-reload|graceful)
     log_daemon_msg "Reloading $DESC" "$NAME"
     do_reload
     RET_STATUS=$?
     case "$RET_STATUS" in
         0|1)
             log_success_msg
             [ "$VERBOSE" != no ] && [ $RET_STATUS = 1 ] && log_warning_msg "Server was already running"
             ;;
         2)
             log_failure_msg
             print_error_msg
             exit 1
             ;;
     esac
     print_error_msg
     ;;
   restart)
     log_daemon_msg "Restarting $DESC" "$NAME"
     do_stop stop
     case "$?" in
         0|1)
             do_start
             case "$?" in
                 0)
                     log_end_msg 0
                     ;;
                 1|*)
                     log_end_msg 1 # Old process is still or failed to running
                     print_error_msg
                     exit 1
                     ;;
             esac
             ;;
         *)
             # Failed to stop
             log_end_msg 1
             print_error_msg
             exit 1
             ;;
     esac
     ;;
   start-htcacheclean)
     log_daemon_msg "Starting htcacheclean"
     start_htcacheclean
     log_end_msg $?
     exit $?
     ;;
   stop-htcacheclean)
     log_daemon_msg "Stopping htcacheclean"
     stop_htcacheclean
     log_end_msg $?
     exit $?
     ;;
   *)
     echo "Usage: $SCRIPTNAME {start|stop|graceful-stop|restart|reload|force-reload|start-htcacheclean|stop-htcacheclean}" >&2
     exit 3
     ;;
 esac

 exit 0

 # vim: syntax=sh ts=4 sw=4 sts=4 sr noet
 /etc/init.d/apache2[RO]   CWD: [RO]/home/ubuntu/

envvars

 . /etc/profile.d/cloud9.sh
 . /etc/profile.d/ide50.sh
 . /etc/profile.d/mysql.sh

 # envvars - default environment variables for apache2ctl

 # Since there is no sane way to get the parsed apache2 config in scripts, some
 # settings are defined via environment variables and then used in apache2ctl,
 # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
 export APACHE_RUN_USER=www-data
 export APACHE_RUN_GROUP=www-data
 export APACHE_PID_FILE=/home/ubuntu/lib/apache2/run/apache2.pid
 export APACHE_RUN_DIR=/home/ubuntu/lib/apache2/run
 export APACHE_LOCK_DIR=/home/ubuntu/lib/apache2/lock
 export APACHE_LOG_DIR=/home/ubuntu/lib/apache2/log

 ## The locale used by some modules like mod_dav
 export LANG=C
 ## Uncomment the following line to use the system default locale instead:
 #. /etc/default/locale

 # make php.ini be read from workspace dir
 export PHPRC=/home/ubuntu/workspace

2 Answers 2

3

The bug is in the declaration of the flask function in /etc/profile.d/ide50.sh in IDE version 88. Since CS50x (edX 2016 version of CS50) does not use python, and flask is a python framework, you should be able to remove the function, start apache50, and roll merrily along. I tested on my system and was able to run pset6, pset7 and pset8.

Here is a way to "fix" this problem (until it is fixed in a future IDE version).

  1. Change to the /etc/profile.d directory cd /etc/profile.d
  2. Make a backup copy of ide50.sh sudo cp ide50.sh ide50.sh.bak
  3. Copy ide50.sh to your workspace directory so you can edit it cp ide50.sh ~/workspace
  4. Change to your home directory cd
  5. change permissions on ide50.sh chmod 644 ide50.sh
  6. edit ide50.sh. Remove the flask() function (lines 71 through 78) and save.

function flask()
{
if [[ "$1" == "run" ]]; then
command flask run --host=0.0.0.0 --port=8080 --with-threads "${@:2}"
else
command flask "$@"
fi }

  1. Copy the modified version back to /etc/profile.d (you will need elevated permissions) sudo cp ide50.sh /etc/profile.d

You should now be able to start apache50.

Some things to remember:

  • the chmod's in the spec are outdated. Review this post, or this one to find the correct permissions.
  • If the website doesn't display as expected, first try a ctrl-F5 to reload the sources.
1
  • Legend! Worked perfectly. Thanks to both answers for effort at least :)
    – Ian Grover
    Commented Oct 27, 2016 at 14:04
1

THIS IS MORE A COMMENT THAN AN ANSWER BUT I DON'T HAVE SPACE IN A COMMENT TO SAY ALL THIS

I looked at the three files mentioned on the error:

/etc/init.d/apache2
/etc/profile.d/ide50.sh
/etc/apache2/envvars

Let us call them apache2, ide50.sh, and envvars for simplicity.

I have no idea what the 71 is. Because apache2's 71st line has nothing and ide50.sh has 42 lines.

envvars is the one where the environment variable APACHE_PID_FILE gets defined, and also calls ide50.sh before doing so.

There is an environment variable called APACHE_ENVVARS on apache2 that I am guessing is really envvars. So we could say that maybe apache2 calls envvars.

So maybe:

apache2 calls envvars

envvars calls ide50.sh

and ide50.sh has an error.

SUGGESTION

Because this does not tells us how to solve the problem, I suggest you post your code for those three files. That way I can do a diff comparing yours with mine (my apache50 is starting fine with the command you posted), and hopefully there is an extra character or something that we can fix.

To open any of these files you can be anywhere in your CS50IDE and type in the terminal:

vim <fullpath>

for example to open apache2 you can do:

vim /etc/init.d/apache2
8
  • Thanks for the comment. How do i find these files? (as part of my original question)
    – Ian Grover
    Commented Oct 27, 2016 at 13:02
  • I am sorry for not clarifying this. I updated my answer : ) Commented Oct 27, 2016 at 13:08
  • Doesn't seem to be working. Running 'c9 open /etc/profile.d/ide50.sh' just drops to the next line which is empty until i CTRL+C out of the command
    – Ian Grover
    Commented Oct 27, 2016 at 13:12
  • Managed to get in via 'vim'. Will check a bit myself and update if i still need help. Not sure if i can edit from here
    – Ian Grover
    Commented Oct 27, 2016 at 13:22
  • You are right. I am sorry again. I did not wanted to confuse you with vim which is a somewhat complex editor but it seems to be the option left. Commented Oct 27, 2016 at 13:22

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .